URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4727
[ Назад ]

Исходное сообщение
"найти вызов функции в coff объектнике, нужен совет"

Отправлено карлсон , 09-Окт-05 00:27 
Задача такая: есть coff объектный файл, созданный стареньким gcc(версию не помню) для процессора microsparcii, нужно найти в коде вызов определенной функции и определить аргументы.

Что сделал: написал небольшую программку дампер и с помощью нее нашел в таблице строк, а потом и в таблице символов запись соответствующую имени нужной мне функции, после этого нашел в таблице релокации соотв. символу запись. Дальше я вытащил в отдельный файл секцию кода и открыл ее с помощью biew в режиме дизассемблера. Я так понимаю: вызов функции происходит в след. порядке, программа складывает в стэк параметры и после этого делает longjump на адрес функции. Попытался поискать в коде адрес, который был в релокационной записи но не нашел ...

Может я что-то не так делаю/предполагаю?


Содержание

Сообщения в этом обсуждении
"найти вызов функции в coff объектнике, нужен совет"
Отправлено vnp , 09-Окт-05 01:33 
>Задача такая: есть coff объектный файл, созданный стареньким gcc(версию не помню) для
>процессора microsparcii, нужно найти в коде вызов определенной функции и определить
>аргументы.
>
>Что сделал: написал небольшую программку дампер и с помощью нее нашел в
>таблице строк, а потом и в таблице символов запись соответствующую имени
>нужной мне функции, после этого нашел в таблице релокации соотв. символу
>запись. Дальше я вытащил в отдельный файл секцию кода и открыл
>ее с помощью biew в режиме дизассемблера. Я так понимаю: вызов
>функции происходит в след. порядке, программа складывает в стэк параметры и
>после этого делает longjump на адрес функции. Попытался поискать в коде
>адрес, который был в релокационной записи но не нашел ...
>
>Может я что-то не так делаю/предполагаю?

Не надо искать адрес. У вас уже есть релокационная запись с символом функции. Она прямо показывает место в коде, где функция используется. Это может быть инструкция вызова подпрограммы либо загрузки регистра. Во втором случае где-то еще в коде будет инструкция вызова, но уже с регистровым операндом. Так или иначе, параметры будут формироваться непосредственно перед вызовом. Имейте в виду, что некоторые (многие) аргументы окажутся в регистрах.
Ловушки:
1. релокационных записей может оказаться несколько, каждая описывает свою точку вызова
2. некоторые релокации могут быть section-relative, и символа функции не содержать.



"найти вызов функции в coff объектнике, нужен совет"
Отправлено карлсон , 10-Окт-05 00:00 
>Не надо искать адрес. У вас уже есть релокационная запись с символом
>функции. Она прямо показывает место в коде, где функция используется.
Я все правильно понимаю, значение записанное в ячейке таблицы релокации это смещение от начала сегмента кода?

В моем случае символ неразрешенный(неслинкованный), поэтому я думал что значение, записанное в ячейке таблицы релокации - это мнимый адрес, по которому "лежит" код данной функции и который будет заменен на конкретное значение во время линковки, разве не так?

>Это
>может быть инструкция вызова подпрограммы либо загрузки регистра. Во втором случае
>где-то еще в коде будет инструкция вызова, но уже с регистровым
>операндом. Так или иначе, параметры будут формироваться непосредственно перед вызовом. Имейте
>в виду, что некоторые (многие) аргументы окажутся в регистрах.
>Ловушки:
>1. релокационных записей может оказаться несколько, каждая описывает свою точку вызова

В моем случае, к счастью, запись одна и находится достаточно легко.

>2. некоторые релокации могут быть section-relative, и символа функции не содержать.



"найти вызов функции в coff объектнике, нужен совет"
Отправлено карлсон , 10-Окт-05 20:30 
Вобщем нашел, все именно так и оказалось, как вы говорили. Спасибо.

"найти вызов функции в coff объектнике, нужен совет"
Отправлено klalafuda , 10-Окт-05 10:48 
>Задача такая: есть coff объектный файл, созданный стареньким gcc(версию не помню) для
>процессора microsparcii, нужно найти в коде вызов определенной функции и определить
>аргументы.
>
>Что сделал: написал небольшую программку дампер и с помощью нее нашел в
>таблице строк, а потом и в таблице символов запись соответствующую имени
>нужной мне функции, после этого нашел в таблице релокации соотв. символу
>запись. Дальше я вытащил в отдельный файл секцию кода и открыл
>ее с помощью biew в режиме дизассемблера. Я так понимаю: вызов
>функции происходит в след. порядке, программа складывает в стэк параметры и
>после этого делает longjump на адрес функции. Попытался поискать в коде
>адрес, который был в релокационной записи но не нашел ...
>
>Может я что-то не так делаю/предполагаю?

как минимум - почитать info по objdump из binutils :) дальше уже дело техники.

// wbr


"найти вызов функции в coff объектнике, нужен совет"
Отправлено карлсон , 10-Окт-05 20:28 
Да objdump сильно упростил дело, спасибо.