Как повторно связать существующую общую библиотеку с дополнительным объектным файлом

У меня есть существующий общий объектный файл Linux (общая библиотека), который был удален. Я хочу создать новую версию библиотеки с некоторыми дополнительными функциями. Я надеялся, что что-то вроде следующего сработает, но не работает:

ld -o newlib.so newfuncs.o --whole-archive existinglib.so

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


person awy    schedule 11.04.2010    source источник


Ответы (4)


Возможно, вы захотите попробовать подойти к этому немного под другим углом, загрузив свой объект с помощью предварительной загрузки.

Установите LD_PRELOAD, чтобы он указывал на ваш новый объект

export LD_PRELOAD=/my/newfuncs/dir/newfuncs.o

и укажите существующую библиотеку таким же образом через ваш LD_LIBRARY_PATH.

Затем это даст указание компоновщику времени выполнения искать необходимые символы в вашем объекте, прежде чем искать объекты, расположенные в вашем LD_LIBRARY_PATH.

Кстати, вы можете поместить вызовы в свой объект, чтобы затем вызвать функцию, которая была бы вызвана, если бы вы не указали объект или объекты LD_PRELOAD. Вот почему это иногда называют вставкой.

Именно так работают многие инструменты анализа распределения памяти. Они вставляют версии malloc() и free(), которые записывают вызовы alloc() и free() перед тем, как вызвать фактические системные функции alloc и free для выполнения управления памятью.

В Интернете есть множество руководств по использованию LD_PRELOAD. Одним из оригинальных и лучших по-прежнему является "Создание интерпозеров библиотеки для удовольствия и прибыли". Несмотря на то, что он был написан девять лет назад и написан для Solaris, он по-прежнему является отличным ресурсом.

ХТ и удачи.

person Rob Wells    schedule 11.04.2010
comment
Да, это решение, но менее удобное, потому что есть несколько приложений, использующих промежуточную библиотеку, но пока это единственное рабочее решение, которое мне удалось найти. - person awy; 12.04.2010

Совершенно непроверенная идея:

# mv existinglib.so existinglib-real.so
# ld -o exlistinglib.so -shared newfuncs.o -lexistinglib-real

Динамический компоновщик при загрузке программы, которая ожидает загрузки existinglib.so, найдет вашу версию, а также загрузит existinglib-real.so, от которой она зависит. Это не совсем достигает заявленной цели вашего вопроса, но должно выглядеть так, как будто это происходит с программой, загружающей библиотеку.

person Kieron    schedule 12.04.2010
comment
Это будет работать только в том случае, если у existslib.so нет динамического тега DT_SONAME (отображается в 'readelf -d existslib.so'). - person Employed Russian; 17.04.2010

Общие библиотеки — это не архивы, они больше похожи на исполняемые файлы. Таким образом, вы не можете просто добавить в них дополнительный контент, как вы могли бы это сделать со статической библиотекой .a.

person Community    schedule 11.04.2010

Краткий ответ: точно то, что вы просили, не может быть сделано.

Более подробный ответ: в зависимости от того, почему вы хотите это сделать и как именно existinglib.so было связано, вы можете приблизиться к желаемому поведению. В дополнение к уже упомянутому LD_PRELOAD и переименованию existinglib.so вы также можете использовать скрипт компоновщика (cat /lib/libc.so, чтобы понять, что я имею в виду).

person Employed Russian    schedule 17.04.2010