Как связать существующую общую библиотеку с дополнительным объектным файлом - PullRequest
2 голосов
/ 11 апреля 2010

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

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

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

Ответы [ 4 ]

2 голосов
/ 11 апреля 2010

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

Установите 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, он по-прежнему отличный ресурс.

HTH и удачи.

1 голос
/ 12 апреля 2010

Полностью непроверенная идея:

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

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

0 голосов
/ 17 апреля 2010

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

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

0 голосов
/ 11 апреля 2010

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

...