Я хотел бы найти адрес в файле .so переменной. Я не знаю названия if, я знаю только, что это целое число, и я знаю его значение. Я также знаю, что после того, как библиотека загружена и связана динамическим компоновщиком, адрес в памяти равен 0x6416A0
относительно адреса библиотеки. Это смещение больше размера самой динамической библиотеки. У меня есть только двоичная, скомпилированная версия библиотеки.Поиск адреса переменной в общей библиотеке
Чтобы найти адрес переменной в файле .so
я смотрел на него с помощью objdump
:
$ objdump -x /path/to/lib.so
Program Header:
LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**21
filesz 0x0000000000505fa9 memsz 0x0000000000505fa9 flags r-x
LOAD off 0x0000000000506000 vaddr 0x0000000000706000 paddr 0x0000000000706000 align 2**21
filesz 0x00000000000db8f0 memsz 0x00000000001764c0 flags rw-
DYNAMIC off 0x00000000005210b0 vaddr 0x00000000007210b0 paddr 0x00000000007210b0 align 2**3
filesz 0x00000000000003e0 memsz 0x00000000000003e0 flags rw-
EH_FRAME off 0x0000000000476898 vaddr 0x0000000000476898 paddr 0x0000000000476898 align 2**2
filesz 0x0000000000014674 memsz 0x0000000000014674 flags r--
STACK off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**3
filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
[...]
Выше я только показал Program Header
, но адрес я ищу не в любом диапазоне адресов доступные разделы. Как вы видите, используемые адреса имеют размер 0x7210b0
, но мой адрес не входит ни в один из диапазонов, которые я вижу.
Поскольку компоновщик использует mmap
для загрузки содержимого файла .so
, я предположил, что знание смещения в памяти эквивалентно знанию смещения в файле. Видимо, это неправильно. Может ли кто-нибудь помочь мне понять, как это работает? Есть ли простой способ сопоставить адрес памяти на адрес файла?
Если вы даже не знаете, что называется переменной, тогда у вас будет небольшая работа по ее поиску. Это вроде как сказать: «Есть эта вещь, и я хочу ее найти. Она красная, но я не знаю, как она называется. Можете ли вы помочь мне найти ее?». Во всей серьезности, не можете ли вы просто построить и связать библиотеку с настройками? Почему вы все равно хотите найти, где это находится в библиотеке? –
Может быть, 'nm' может помочь. – pentadecagon
@ Phil_12d3 Конечно, я не могу построить и связать его - некоторые библиотеки входят в двоичную. Вопрос не в поиске _something red_: я знаю адрес переменной после связывания в памяти. То, что я не знаю, - это то, как компоновщик фактически загружает библиотеку, и на какую физическую часть файла входит карта адреса. – angainor