как разделяемая библиотека может получить свой собственный базовый адрес - PullRequest
2 голосов
/ 21 июля 2010

У меня есть адрес смещения всех символов (полученный с помощью libelf, выполняющегося в его собственном двоичном файле .so).Теперь во время выполнения мне нужно будет вычислить абсолютные адреса всех этих символов, и для этого мне нужно получить базовый адрес (где загружена общая библиотека) и выполнить вычисление:

symbol_address = base_address+ symbol_offset

Как разделяемая библиотека может получить свой собственный базовый адрес?В Windows я бы использовал параметр, переданный в DllMain, есть ли какой-нибудь эквивалент в Linux?

Ответы [ 2 ]

4 голосов
/ 24 июля 2010

В Linux dladdr() для любого символа из libfoo.so даст вам

  void *dli_fbase;      /* Load address of that object */

Дополнительная информация здесь .

В качестве альтернативы, dl_iterate_phdr может дать адрес загрузки каждого изображения ELF, загруженного в текущий процесс.

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

0 голосов
/ 13 декабря 2010

После некоторых исследований мне удалось выяснить способ определения адреса загрузки библиотеки по ее дескриптору, который возвращается функцией dlopen (). Это выполняется с помощью такого макроса:

#define  LIBRARY_ADDRESS_BY_HANDLE(dlhandle) ((NULL == dlhandle) ? NULL :  (void*)*(size_t const*)(dlhandle))
...