Задача такая: есть coff объектный файл, созданный стареньким gcc(версию не помню) для процессора microsparcii, нужно найти в коде вызов определенной функции и определить аргументы.Что сделал: написал небольшую программку дампер и с помощью нее нашел в таблице строк, а потом и в таблице символов запись соответствующую имени нужной мне функции, после этого нашел в таблице релокации соотв. символу запись. Дальше я вытащил в отдельный файл секцию кода и открыл ее с помощью biew в режиме дизассемблера. Я так понимаю: вызов функции происходит в след. порядке, программа складывает в стэк параметры и после этого делает longjump на адрес функции. Попытался поискать в коде адрес, который был в релокационной записи но не нашел ...
Может я что-то не так делаю/предполагаю?
>Задача такая: есть coff объектный файл, созданный стареньким gcc(версию не помню) для
>процессора microsparcii, нужно найти в коде вызов определенной функции и определить
>аргументы.
>
>Что сделал: написал небольшую программку дампер и с помощью нее нашел в
>таблице строк, а потом и в таблице символов запись соответствующую имени
>нужной мне функции, после этого нашел в таблице релокации соотв. символу
>запись. Дальше я вытащил в отдельный файл секцию кода и открыл
>ее с помощью biew в режиме дизассемблера. Я так понимаю: вызов
>функции происходит в след. порядке, программа складывает в стэк параметры и
>после этого делает longjump на адрес функции. Попытался поискать в коде
>адрес, который был в релокационной записи но не нашел ...
>
>Может я что-то не так делаю/предполагаю?Не надо искать адрес. У вас уже есть релокационная запись с символом функции. Она прямо показывает место в коде, где функция используется. Это может быть инструкция вызова подпрограммы либо загрузки регистра. Во втором случае где-то еще в коде будет инструкция вызова, но уже с регистровым операндом. Так или иначе, параметры будут формироваться непосредственно перед вызовом. Имейте в виду, что некоторые (многие) аргументы окажутся в регистрах.
Ловушки:
1. релокационных записей может оказаться несколько, каждая описывает свою точку вызова
2. некоторые релокации могут быть section-relative, и символа функции не содержать.
>Не надо искать адрес. У вас уже есть релокационная запись с символом
>функции. Она прямо показывает место в коде, где функция используется.
Я все правильно понимаю, значение записанное в ячейке таблицы релокации это смещение от начала сегмента кода?В моем случае символ неразрешенный(неслинкованный), поэтому я думал что значение, записанное в ячейке таблицы релокации - это мнимый адрес, по которому "лежит" код данной функции и который будет заменен на конкретное значение во время линковки, разве не так?
>Это
>может быть инструкция вызова подпрограммы либо загрузки регистра. Во втором случае
>где-то еще в коде будет инструкция вызова, но уже с регистровым
>операндом. Так или иначе, параметры будут формироваться непосредственно перед вызовом. Имейте
>в виду, что некоторые (многие) аргументы окажутся в регистрах.
>Ловушки:
>1. релокационных записей может оказаться несколько, каждая описывает свою точку вызоваВ моем случае, к счастью, запись одна и находится достаточно легко.
>2. некоторые релокации могут быть section-relative, и символа функции не содержать.
Вобщем нашел, все именно так и оказалось, как вы говорили. Спасибо.
>Задача такая: есть coff объектный файл, созданный стареньким gcc(версию не помню) для
>процессора microsparcii, нужно найти в коде вызов определенной функции и определить
>аргументы.
>
>Что сделал: написал небольшую программку дампер и с помощью нее нашел в
>таблице строк, а потом и в таблице символов запись соответствующую имени
>нужной мне функции, после этого нашел в таблице релокации соотв. символу
>запись. Дальше я вытащил в отдельный файл секцию кода и открыл
>ее с помощью biew в режиме дизассемблера. Я так понимаю: вызов
>функции происходит в след. порядке, программа складывает в стэк параметры и
>после этого делает longjump на адрес функции. Попытался поискать в коде
>адрес, который был в релокационной записи но не нашел ...
>
>Может я что-то не так делаю/предполагаю?как минимум - почитать info по objdump из binutils :) дальше уже дело техники.
// wbr
Да objdump сильно упростил дело, спасибо.