Как я могу удалить связанную библиотеку из исполняемого файла - PullRequest
3 голосов
/ 27 сентября 2011

Все.

Кто-то создал исполняемый файл.

# 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.

Так что ясоздать libA.so, охватывающий все API, предоставляемые libB.so.

Тогда мне нужно заново связать эту библиотеку.Но у меня нет источника для test_bin.

Как удалить ссылку на libB.so из исполняемого файла без каких-либо источников?

Возможно ли это?Я просто смотрю вокруг binutils.Но я не нашел для этого.

Пожалуйста, дайте мне совет.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2011

Я не думаю, что это возможно, потому что даже когда вы делаете libA.so обертку libB.so (то, что вы описали как обложки), libA.so по-прежнему зависит от функций libB.so, поэтому оба должны быть связан с вашим исполняемым файлом. Единственный известный мне обходной путь - это то, что @thiton предложил или заставил libA.so реализовать libB.so, не завися от этого, то есть реализовать все функции libB.so или только те, которые вам нужны.

0 голосов
/ 27 сентября 2011

отредактируйте исполняемый файл и замените

libA.so.0 

на

libB.so.0 

, это работает, потому что sizeo в "libA.so.0" совпадает с sizeo в "libB.so.0"».

Если вы добавите или удалите дополнительный символ, он наверняка нарушит исполняемый файл.

0 голосов
/ 27 сентября 2011

Вы можете пойти простым путем и сделать libB.so и libB.so.0 символической ссылкой на libA.so.0.Не изменяет исполняемый файл, но является быстрым и переносимым решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...