Как установить путь динамического компоновщика для общей библиотеки? - PullRequest
4 голосов
/ 20 декабря 2010

Я хочу скомпилировать разделяемую библиотеку с сегментом .interp.

#include <stdio.h>

int foo(int argc, char** argv) {

    printf("Hello, world!\n");
    return 0;

}

Я использую следующие команды.

gcc -c -o test.o test.c
ld --dynamic-linker=blah -shared -o test.so test.o

В итоге я не получаю сегмент INTERP, как будто я никогда не пропускаю опцию --dynamic-linker=blah.Проверьте с readelf -l test.so.При создании исполняемого файла компоновщик правильно обрабатывает опцию и помещает сегмент INTERP в заголовок программы.Как сделать так, чтобы это работало и для разделяемых библиотек?

Ответы [ 3 ]

2 голосов
/ 22 июля 2015

ld не включает раздел .interp, если используется -shared, как уже сказал @MichaelDillon.Однако вы можете предоставить этот раздел самостоятельно.

const char interp_section[] __attribute__((section(".interp"))) = "/path/to/dynamic/linker";

Строка выше сохранит строку "/ path / to / dynamic / linker" в разделе .interp, используя атрибуты GCC .

Если вы пытаетесь создать общий объект, который также сам по себе является исполняемым, отметьте этот вопрос .У этого есть более всестороннее описание процесса.

1 голос
/ 13 апреля 2012

В большинстве систем linux ldconfig запускается при каждой загрузке системы и ищет определения в /etc/ld.so.conf для поиска в каталогах с общими библиотеками. В файле /etc/ld.so.cache отображаются сопоставления для общих библиотек sonames и полный путь к библиотеке. Вы можете прочитать эту статью: http://grahamwideman.wordpress.com/2009/02/09/the-linux-loader-and-how-it-finds-libraries/#comment-164

1 голос
/ 14 июля 2011

Сегмент INTERP идет только в двоичные файлы, которые должны загружать ELF-интерпретатор (ld.so) в первую очередь.Общая библиотека не имеет сегмента INTERP, поскольку интерпретатор ELF уже загружен до загрузки общей библиотеки.

...