3

Я столкнулся с этой проблемой в своем текущем проекте, который требует рассуждения о коде на двоичном уровне.С учетом адреса инструкции можно определить начальный адрес функции, входящей в нее?

Я думаю, что мы можем определить начальное местоположение всех функций в программе, посмотрев инструкции операнда на CALL. После того, как у нас есть этот список, мы можем определить, какая функция содержит адрес, просто отыскивая назад, пока мы не найдем начальный адрес? IE является начальным адресом функции, содержащей инструкцию, наибольший адрес функции, который меньше адреса инструкции?

Если приведенный выше метод неверен, существует ли другой способ найти начальный адрес функции, содержащей инструкцию?

Редактировать: Добавлено уточнение вопроса.

изменить2: Возможно, мой метод неправильный. Компиляторам не гарантировано разместить функциональные тела в смежных областях машинного кода.

+1

Язык ассемблера даже не требуется для использования функций. Это может быть просто большой спагетти беспорядков gotos. –

+0

Вы правы в контексте языка ассемблера. Контекст этого - результат скомпилированного языка. – lea

ответ

3

Вам необходимо больше ограничить пространство проблем. Даже когда ограничивается только «выводом компилируемого языка», компиляторы в настоящее время хорошо размывают границы между функциями. Вложение означает, что одна функция может быть заключена в другую. Оптимизация Tail-call передает управление между двумя функциями без инструкции CALL. Оптимизация с помощью профиля может создавать несмежные функции. Анализ потока кода и подсказки noreturn могут привести к попаданию кода в данные. Таблицы перехода означают, что данные могут пройти до кода без цели CALL. Единственный надежный способ заключается в том, чтобы компилятор явно указывал вам сопоставление между функциями, например, посредством отладочной информации. Вы не сказали, какую платформу вы используете, поэтому сложно дать более конкретную информацию.

+0

Спасибо. Первоначально я надеялся, что смогу сделать это для любого скомпилированного двоичного файла, но похоже, что мне придется ограничивать двоичные файлы, собранные из C, и использовать отладочную информацию. – lea

0

Нет, код сборки может делать всевозможные напуганные вещи. Один вызов может полностью перепрыгнуть через другую функцию, перепрыгнуть назад или в другой модуль.

+0

Нет, это невозможно определить, или мой метод неправильный? – lea

+0

В общем, вы не можете это определить. Ваша фактическая ситуация будет отличаться в зависимости от того, как создается двоичный код функции; для некоторых компиляторов, rscheme может работать. Но в целом вы не можете доверять тому, что представляется инструкциями, на самом деле быть инструкциями. Если вы не можете рассчитывать на это, вы не сможете проследить свой путь «назад» до начала функции. –

+0

Отладчики могут это сделать. Должно ли быть возможно с отладочной информацией? – lea

 Смежные вопросы

  • Нет связанных вопросов^_^