2017-01-20 6 views
0

Скажите, что у меня есть три библиотеки: libMissingSymbol.so, libMiddle.so и libSymbolHaver.so. libMissingSymbol содержит символ, определенный в libSymbolHaver, но имеет только зависимость от libMiddle. Предполагается, что libMiddle имеет зависимость от libSymbolHaver, но это не так. У меня нет исходного кода или несвязанных объектных файлов, из которых были собраны эти библиотеки. Возможно ли связать libMiddle с libSymbolHaver, чтобы libMissingSymbol мог найти символ, который ему нужен во время загрузки? Есть ли способ, которым я могу исправить это, используя только эти три общих объектных файла и любые необходимые инструменты? Я должен закончить с библиотеками с тем же содержимым (включая SONAME), запрещающим изменение зависимостей в libMiddle, чтобы не сломать вещи дальше по строке в моем проекте.Добавить зависимость от существующей библиотеки общих объектов

Гипотетический readelf выход (обрезается по релевантности) уточнить:

$ readelf -s libMissingSymbol.so 
123: 00000000  0 OBJECT GLOBAL DEFAULT UND MangledSymbol 

$ readelf -d libMissingSymbol.so 
Dynamic section at offset 0x42434 contains 37 entries: 
    Tag  Type       Name/Value 
0x00000001 (NEEDED)      Shared library: [libMiddle.so] 
0x0000000e (SONAME)      Library soname: [libMissingSymbol.so] 

$ readelf -d libMiddle.so 
Dynamic section at offset 0x75b28 contains 29 entries: 
    Tag  Type       Name/Value 
0x0000000e (SONAME)      Library soname: [libMiddle.so] 

$ readelf -s libSymbolHaver.so 
    35: 00064d0c  4 OBJECT GLOBAL DEFAULT 22 MangledSymbol 

ответ

1

Можно ли мне связать libMiddle с libSymbolHaver так, что libMissingSymbol может найти символ это нужно во время загрузки? не

№: все линкеры UNIX, кроме AIX один, рассмотрят .so в окончательного ссылка продукта и дальнейшее изменения невозможно.

Update:

жизнеспособность сделать это другим способом (например, декомпиляции libMiddle и восстановление его с правильными зависимостями)?

Я не считаю, что это жизнеспособный либо - это действительно трудно, чтобы изменить полностью связанный файл ELF и не нарушают множество внутренних ограничений на непротиворечивость.

Предлагаю следующий подход, который, скорее всего, будет работать (TM).

  1. Исключить ограничение «только с использованием этих трех библиотек». Это кажется искусственным и ненужным.

  2. Копия libMiddle.so ->libZiddle.so (не забудьте сделать копию оригинала libMiddle.so где-нибудь еще, если все пойдет не так).

  3. binary-patch SONAME в libZiddle.so в соответствии с новым именем. Строка "libMiddle.so" находится в разделе библиотеки .dynstr и, я полагаю, не имеет никакого хеширования, поэтому изменение одной буквы в ней не приведет к каким-либо несоответствиям в новой библиотеке.

    После того, как вы сделали это, сравните readelf -a libMiddle.so и readelf -a libZiddle.so, то SONAME должна быть разница только.

  4. Удалить libMiddle.so.

  5. Ссылка новый libMiddle.so содержащий some_unused_function(), и имеющий динамическую зависимость от какlibZiddle.soиlibSymbolHaver.so.

Теперь любой двоичный файл, который в настоящее время связывает с libMiddle.so и не с отсутствующим символом (например, libMissingSymbol.so) найдет новый (пустой) libMiddle.so, а потому, что новый libMiddle.so требует как libZiddle.so (где большинство символов являются) иlibSymbolHaver.so, он должен просто работать.

+0

Спасибо за ваш ответ. Есть ли у вас какое-либо представление о целесообразности выполнения этого по-другому (например, декомпиляция libMiddle и перестройка его с правильными зависимостями)? –

+0

@ThomasDeSilva Я обновил ответ. –

+0

Re: point # 1, у меня было ограничение, потому что точка всего этого заключается в том, чтобы эмулировать другую среду исполнения, в которой у меня нет контроля (у меня есть более подробное сообщение на более конкретном форуме [здесь] (https: //www.chiefdelphi.com/forums/showthread.php?t=153697), если вы хотите узнать подробности). Однако ваша ревизия привела меня к рассмотрению моей ситуации, и я обнаружил настоящую проблему: перекос версии в моих библиотеках. Мне не пришлось пробовать свой подход, но я принимаю ваш ответ; Спасибо еще раз за помощь. –