4

全て。

誰かが実行可能ファイルを作成しました。

# ldd test_bin 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x4082d000)
    libA.so.0 => /usr/lib/libA.so.0 (0x408fe000)
    libB.so.0 => /usr/lib/libB.so.0 (0x4093e000)
    libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x409ad000)
    libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x409fe000)
    librt.so.1 => /lib/librt.so.1 (0x40a0a000)
    libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x40a19000)
    libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0x40b25000)
    libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x40b67000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40bb0000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x40bc3000)
    libc.so.6 => /lib/libc.so.6 (0x40be3000)
    libm.so.6 => /lib/libm.so.6 (0x40d11000)
    libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0x40d87000)
    /lib/ld-linux.so.3 (0x40000000)
    libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x40f4e000)
    libdl.so.2 => /lib/libdl.so.2 (0x40f59000)

この場合、libB.so を libA.so にマージしたいと考えています。

そこで、libB.so が提供するすべての API をカバーする libA.so を作成します。

次に、このライブラリと再リンクする必要があります。しかし、test_bin のソースがありません。

ソースなしで実行可能ファイルから libB.so リンクを削除するにはどうすればよいですか?

出来ますか?binutils を見回すだけです。しかし、私はそれを見つけていません。

アドバイスをお願いします。

4

3 に答える 3

0

libA.soをlibB.so(カバーとして説明したもの)でラップしても、libA.soは依然としてlibB.soの機能に依存しているため、両方をリンクする必要があるため、可能ではないと思います実行可能。私が知っている唯一の回避策は、@thitonが提案したか、libA.soに依存せずにlibB.soを実装させることです。つまり、libB.soのすべての機能を実装するか、必要なものだけを実装します。

于 2011-09-27T09:06:31.103 に答える
0

簡単な方法で、libB.so と libB.so.0 を libA.so.0 へのシンボリック リンクにすることができます。実行可能ファイルを変更しませんが、迅速で移植可能なソリューションです。

于 2011-09-27T08:59:26.170 に答える
0

実行可能ファイルを編集して置換

libA.so.0 

libB.so.0 

これは、「libA.so.0」の sizeo が「libB.so.0」の sizeo と同じであるため機能します。

余分なシンボルを追加または削除すると、実行可能ファイルが確実に壊れます。

于 2011-09-27T09:26:58.550 に答える