Могу ли я добавить ссылку на библиотеку в существующий общий объект? - PullRequest
11 голосов
/ 19 ноября 2010

У меня есть система "fsimage.so", которая требует mkdirp, который, как оказалось, живет в libgen.so.Но fsimage.so не знает этого.Например:

# ldd /usr/lib/python2.4/vendor-packages/fsimage.so
    libfsimage.so.1.0 =>     /usr/lib/libfsimage.so.1.0
    libxml2.so.2 =>  /lib/libxml2.so.2
    libgcc_s.so.1 =>         /usr/sfw/lib/libgcc_s.so.1
    libpthread.so.1 =>       /lib/libpthread.so.1
    libz.so.1 =>     /lib/libz.so.1
    libm.so.2 =>     /lib/libm.so.2
    libsocket.so.1 =>        /lib/libsocket.so.1
    libnsl.so.1 =>   /lib/libnsl.so.1
    libc.so.1 =>     /lib/libc.so.1
    libmp.so.2 =>    /lib/libmp.so.2
    libmd.so.1 =>    /lib/libmd.so.1

# ./test
Traceback (most recent call last):
  File "./test", line 26, in ?
    import fsimage
ImportError: ld.so.1: isapython2.4: fatal: relocation error: file /usr/lib/python2.4/vendor-packages/fsimage.so: symbol mkdirp: referenced symbol not found

# LD_PRELOAD=/usr/lib/libgen.so ./test
Usage: ./test

Естественно, если бы у меня были источники и т. Д., Я мог бы просто связать его снова и добавить «-lgen», и он добавит libgen.so в качестве зависимости.

Но, как упражнение в хакерстве, скажем, у меня нет источников, и я просто хотел добавить, что fsimage.so должен также загрузить libgen.so.Использование elfedit / objcopy и т. Д. Разве это невозможно?Я не думаю, что я могу использовать «ld» для использования .so в качестве входных данных и написать новый .so с дополнительной библиотекой?

# elfdump /usr/lib/python2.4/vendor-packages/fsimage.so|grep NEEDED
   [0]  NEEDED            0x5187              libfsimage.so.1.0
   [1]  NEEDED            0x5152              libxml2.so.2
   [2]  NEEDED            0x5171              libgcc_s.so.1

Первая попытка переполнения стека, легко для меня :)*

Ответы [ 3 ]

10 голосов
/ 22 ноября 2010

Спасибо "Занятый русский", вы дали мне информацию, необходимую для более глубокого поиска.Solaris уже поставляется с "elfedit", поэтому, если другие хотят знать, это инструкции

# elfedit libfsimage.so.1.0.0 libfsimage.so.1.0.0-new
> dyn:value DT_NEEDED
 index  tag                value
   [0]  NEEDED            0x4f81              libpthread.so.1
   [1]  NEEDED            0x4fac              libxml2.so.2
   [2]  NEEDED            0x4fc2              libgcc_s.so.1
> dyn:value -add -s DT_NEEDED libscf.so
 index  tag                value
  [35]  NEEDED            0x500d              libscf.so
> dyn:value DT_NEEDED
 index  tag                value
   [0]  NEEDED            0x4f81              libpthread.so.1
   [1]  NEEDED            0x4fac              libxml2.so.2
   [2]  NEEDED            0x4fc2              libgcc_s.so.1
  [35]  NEEDED            0x500d              libscf.so
> :write
> :quit

# ldd libfsimage.so.1.0.0-new
    libpthread.so.1 =>       /lib/libpthread.so.1
    libxml2.so.2 =>  /lib/libxml2.so.2
    libgcc_s.so.1 =>         /usr/sfw/lib/libgcc_s.so.1
    libscf.so =>     /lib/libscf.so
    libz.so.1 =>     /lib/libz.so.1
    libm.so.2 =>     /lib/libm.so.2
    libsocket.so.1 =>        /lib/libsocket.so.1
    libnsl.so.1 =>   /lib/libnsl.so.1
    libc.so.1 =>     /lib/libc.so.1
    libuutil.so.1 =>         /lib/libuutil.so.1
    libgen.so.1 =>   /lib/libgen.so.1
    libnvpair.so.1 =>        /lib/libnvpair.so.1
    libsmbios.so.1 =>        /usr/lib/libsmbios.so.1
    libmp.so.2 =>    /lib/libmp.so.2
    libmd.so.1 =>    /lib/libmd.so.1
7 голосов
/ 20 ноября 2010

Непросто.

Большинство UNIX систем (AIX является заметным исключением) считают *.so "конечным" продуктом ссылки, и он не подходит в качестве входных данных для любой дальнейшей ссылки.

Чтобы добавить новый тег DT_NEEDED в динамический раздел fsimage.so, вам необходимо переписать его .dynamic раздел.Удаление записи из .dynamic относительно просто - вы можете просто «сдвинуть» другие записи вверх и заменить последнюю запись на DT_NULL.

С другой стороны, добавление новой записи требует, чтобыВы добавляете в файл новый раздел .dynamic, а затем обновляете все указатели (смещения) в пределах fsimage.so, чтобы указывать на новый раздел.Это требует «глубокого» понимания формата ELF.

Существуют инструменты для этого, например, rpath, но у меня был смешанный успех с ним.

1 голос
/ 24 сентября 2015

Вы можете использовать PatchELF . Релиз 0.9 выходит с 29 февраля 2016 года и позволяет:

  • Изменить динамический загрузчик («ELF-интерпретатор») исполняемых файлов
  • Изменить RPATH исполняемых файлов и библиотек
  • Сокращение RPATH исполняемых файлов и библиотек
  • Удалить объявленные зависимости от динамических библиотек (DT_NEEDED записей)
  • Добавление объявленной зависимости от динамической библиотеки (DT_NEEDED)
  • Заменить объявленную зависимость от динамической библиотеки другой (DT_NEEDED)
  • Изменить SONAME динамической библиотеки

В вашем случае:

$ patchelf --add-needed /usr/lib/libgen.so /usr/lib/python2.4/vendor-packages/fsimage.so
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...