В конструкторе общей библиотеки (раздел _init), как узнать, какая функция прервана? - PullRequest
0 голосов
/ 21 июля 2011

В x86 linux процесс A.exe вызывает dlopen () для загрузки общей библиотеки B.so. В B.so есть конструктор, который хочет знать, какая функция в процессе A.exe прерывается непосредственно перед вызовом dlopen ().

Как конструктор (раздел _init) в B.so знает?

1 Ответ

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

Если я правильно понимаю ваш вопрос («прерывание» может вводить в заблуждение), в вашем приложении A есть несколько местоположений, которые могут вызывать dlopen (), и вы хотите знать, из какого из этих местоположений вам звонили.

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

Во-вторых, если вам действительно нужно сделатьэто ( почему? ), тогда вы можете взять обратную трассировку в своей функции конструктора.Затем ищите вверх, пока не найдете dlopen (), и в следующем более высоком кадре стека вы найдете функцию, которая называется dlopen.

РЕДАКТИРОВАТЬ: чтобы отобразить адреса в трассировке стека обратно на функции, вам понадобится отладочная информациязадействованных двоичных файлов или любой другой способ сопоставления адресов функций с именами символов.

...