Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607

Получить адрес строки Си в HEX (GCC)

21.03.2016, 12:38. Показов 3109. Ответов 11

Студворк — интернет-сервис помощи студентам
Привет всем.

Появилась необходимость найти адрес строчки Си в скомпилированном файле, желательно HEX. При компиляции проекта линкер может формировать *.elf, *.hex, *.map, *.lss файлы, которые имеют информацию о скомпилированных функциях. Наиболее интересными являются *.elf (с инфой, которую пользует дебаггер), *.map - в которой указаны оффсеты точек входа для всех функций, и *.lss -> дизасм вместе с кодом Си и оффсетами, что немаловажно. Но в *.lss мы имеем соптимизированный код, так что иногда вызываемые строчки иногда не соответствуют ассемблеру, что очень обидно.

... среди утилит GCC есть прога, которая ищет строчку кода Си (имя файла и номер строки) по переданному ей оффсету. Но может быть кто-то знает как сделать наоборот? То есть получить оффсет по строчке?

ЗЫ: в GCC дебаггере есть возможность выставлять брейк-поинты по строчкам, чтобы при работе дебаггера программа останавливалась при отладке. Так вот как-то внутри же GCC знает где ему останавливаться? И может быть кто-то получал уже такую информацию?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2016, 12:38
Ответы с готовыми решениями:

Как Получить HEX код из строки
Помогите у меня есть такая строка $str = "{FFFFFF}Text{00FF00}Текст{0000FF}123"; Вопрос в том как мне вытащить только это:...

Получить адрес строки из Application.InputBox
Добрый день форумяне! возможно ли передать в переменную не содержание ячейки а ее адрес или номер строки? используя dell =...

Получить адрес переменной, и сохранить в виде строки
Как получить адреc переменной, и записать этот адрес в другую переменную в виде строки std::string?

11
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
21.03.2016, 17:16
Цитата Сообщение от Voland_ Посмотреть сообщение
желательно HEX.
Ну, по моему это нереально
с BIN еще можно попробовать

но вообще компиляция необратимый процесс, плюс добавь сюда оптимизацию, которая вообще код полностью может перелопатить
Цитата Сообщение от Voland_ Посмотреть сообщение
GCC дебаггере есть возможность выставлять брейк-поинты по строчкам, чтобы при работе дебаггера программа останавливалась при отладке. Так вот как-то внутри же GCC знает где ему останавливаться?
конкретно за GCC не скажу, но вот как работает VC наблюдал
во первых вся оптимизация выключена, во вторых расставляет метки, в третьих работает практически как транслятор, переводит каждую строчку отдельно
стоит только включить релиз режим вся отладка летит
в том же VS есть возможность включить в исполняемый код отладочную информацию, тогда IDA пытается восстановить структуру файла, но кроме имен функций и имен классов больше ничего нет, те же имена функций теряется

а для чего эта задача?
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
21.03.2016, 17:43  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
а для чего эта задача?
ValeryS, задача выполнить "брейкпоинт" в отладчике, который априори это не поддерживает.

ЗЫ: пока остановился на варианте сбора смещений с помощью скриптика из lss-файла. Визуально оффсеты в 99% случаев предшествуют метке сишной строки. Просто я встречал ситуации когда это условие не соблюдается. Но... и 99% случаев - это УЖЕ очень неплохо.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
21.03.2016, 18:04
могу предложить такой вариант
"отладочная печать" но не совсем

C++
1
2
3
4
void funcTest (char*)
{
//что то делаем без разницы, главное чтобы оптимизатор эту функцию не выбросил
}
потом где то функция, которую нужно отладить, перед функцией

C
1
2
3
4
5
6
7
const char* buf="Test";
void MyFunc()
{
...........
funcTest(buf);
.............
}
потом ищешь в бинарном файле строку, например у компиляторов х86 она будет стоять перед нужной функцией
как у микроконтроллеров, кто его знает
потом ищешь место где ссылаются на эту строчку, это и будет тестовая функция
а после неё или переред ставишь брекпоинт

очень удобна в этом случае будет IDA
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
21.03.2016, 20:58  [ТС]
ValeryS, в том и дело - меня код нельзя. Ну, или в идеальном случае - нельзя.
В принципе, я тут глянул какие файлы формирует CVAVR - ситуация примерно та же. Пример:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0002a2 9508         RET
                 ;void en_RX(void)
                 ; 0005 0056 {
                 _en_RX:
                 ; 0005 0057   PORTD.1=0;
0002a3 9891         CBI  0x12,1
                 ; 0005 0058   UCSRB = (UCSRB | 0x10) & ~0x08; // disable the USORT transmitter and enable the receiver
0002a4 b1ea         IN   R30,0xA
0002a5 61e0         ORI  R30,0x10
0002a6 7fe7         ANDI R30,0XF7
0002a7 b9ea         OUT  0xA,R30
                 ; 0005 0059   delay_us(100);
                +
0002a8 ec88     +LDI R24 , LOW ( 200 )
0002a9 e090     +LDI R25 , HIGH ( 200 )
                +__DELAY_USW_LOOP :
0002aa 9701     +SBIW R24 , 1
0002ab f7f1     +BRNE __DELAY_USW_LOOP
                    __DELAY_USW 200
                 ; 0005 005A }
0002ac 9508         RET
Из примера кода видно (это кусок файла *.lst), что команды ассемблера идут аккурат за строчками Си. То есть можно как визуально, так и автоматически привязаться к этому. Вот примерно также я и сделал, только там сначала идет оффсет, затем - несколько строчек Си, включая коменты и пустые строки, затем disasm.

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

Добавлено через 1 минуту
PS: выдернуть можно, кстати, перебрав все возможные оффсеты памяти камня и получить строки, соответствующие каждому оффсету ). Для той же Меги8 это всего-то 4к адресов. Но это ж издевательство, особенно, если взять, к примеру, кортексы, у которых адресное поле 32бита ).
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
22.03.2016, 09:24
Цитата Сообщение от Voland_ Посмотреть сообщение
ValeryS, в том и дело - меня код нельзя.
а с чем работаешь? с AVRками?
сейчас попробовал такой путь
связка протеус-CodeVision
в протеус загружаю файл *.cof, потом ставлю точку останова в Сишном листинге, и когда остановится открываю окошко с регистрами и вижу состояния регистра PC
так сложно потому, что дизасемблируемого листинга в протеусе не нашел
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
22.03.2016, 10:57  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
с чем работаешь? с AVRками?
Нет. Но в случае с GCC это имеет отдаленное отношение. Сейчас надо увидеть хотя бы общий подход.
Цитата Сообщение от ValeryS Посмотреть сообщение
связка протеус-CodeVision
не подходит. Нужно какой-то "открытый" инструмент, чтобы можно было управлять им из командной строки, типа скрипта.
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
22.03.2016, 23:02
Можно написать простенькую утилиточку, которая будет ручками копаться в бинарнике в поисках строчечки.
Можно в руби или питоне в 10 строчек с использованием регэкспов это дело написать...

П.С. А objdump -t... Это, я так понимаю, не то что надо?
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
22.03.2016, 23:19  [ТС]
Цитата Сообщение от Mirmik Посмотреть сообщение
Можно написать простенькую утилиточку, которая будет ручками копаться в бинарнике в поисках строчечки.
а конкретнее, какой строчечки?
Цитата Сообщение от Mirmik Посмотреть сообщение
objdump -t
<== выводит список именованных меток в файле. Их довольно много и среди них есть имена функций например, что уже хорошо. То есть как минимум можно контролировать вызов функций. Но если вы хотите влезть прямо в середину кода - то этот вариант таких подробностей не дает.
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
22.03.2016, 23:22
найти адрес строчки Си в скомпилированном файле
Тут просто небольшая непонятка в темринологии. Вас интересует смещение строки от начала бинарного файла, или тот адрес, по которому будет лежать строка во время выполнения программы?\

P.S. Ага... Прочитал ветку, понял задачу...
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
22.03.2016, 23:39
Цитата Сообщение от Voland_ Посмотреть сообщение
Сейчас надо увидеть хотя бы общий подход.
думаю что общий подход здесь не удастся, "В каждой избушке свои погремушки" какой компилятор, какой камень, какой режим оптимизации, и все это будет влиять на результат
Цитата Сообщение от Voland_ Посмотреть сообщение
Нужно какой-то "открытый" инструмент, чтобы можно было управлять им из командной строки, типа скрипта.
Мы не поняли друг друга
я предлагал в протеусе, искать соответствие СИшной строки и значения регистра счетчика команд, то бишь
Цитата Сообщение от Voland_ Посмотреть сообщение
найти адрес строчки Си в скомпилированном файле,
а потом эти значения использовать в реальном отладчике

Добавлено через 3 минуты
Да кстати
Цитата Сообщение от Voland_ Посмотреть сообщение
адрес строчки Си
действительно вызывает разночтения
что есть строчка?
1 строка в листинге на Си, оператор
2 строка в стиле Си, сиречь набор символов с 0 в конце
я вот подумал про первое,а Mirmik, судя по всему про второе
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
23.03.2016, 09:43  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
я предлагал в протеусе, искать соответствие СИшной строки и значения регистра счетчика команд, то бишь
да я понял. просто Протеус эти значения выводит на экран, и забрать их автоматически в какой-нибудь текстовый файл для дальнейшего использования в скрипте не получится. Поэтому, я и отнес это к некой "закрытости", то есть невозможности использовать другими программами и скриптами в автоматическом режиме.
Цитата Сообщение от ValeryS Посмотреть сообщение
действительно вызывает разночтения
что есть строчка?
1 строка в листинге на Си, оператор
2 строка в стиле Си, сиречь набор символов с 0 в конце
я вот подумал про первое,а Mirmik, судя по всему про второе
Согласен, каюсь ). Насчет "строчки Си" подразумевалась строчки программы Си, а не строковых данных и констант в HEX. Последние действительно можно искать с помощью предложенного ув. Mirmik выше варианта. И objdump был бы здесь как нельзя кстати.

ну а насчет
Цитата Сообщение от ValeryS Посмотреть сообщение
"В каждой избушке свои погремушки"
- отчасти согласен, но GCC как "отец" своих отпрысков имеет 99% схожести по части линковки. Как бы ни строился проект - его линковка происходит по очень схожим принципам, даже если МК имеет очень "иную" архитектуру. Отчасти это накладывает внутренние неудобства, и разработчик вынужден сам думать что и где расположить и как линковать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.03.2016, 09:43
Помогаю со студенческими работами здесь

Получить адрес ячейки и изменить номер строки
Добрый день! Мне нужно получить адрес последней непустой ячейки в каждой строке и затем изменить на первую строку... Я нашел формулу для...

Как в AVR-GCC вычислять адрес для in/out?
Hi, Ott! Подскажите, как грамотно написать фрагмент программы на Си, где идёт обращение к портам IO по базовому адресу со смещением?...

Преобразование HEX в адрес в CheatEngine
Привет всем! Дизассемблирую свою программку в CheatEngine. Там есть такая команда: 00690498 - E8 0B10C06F - call clr.dll+14A8 ...

Динамический двумерный массив (получить адрес первого элемента первой строки)
есть двумерный массив ........ // объявление двумерного динамического массива int **matrix=new int* ; for(int count=0; count...

Как записать MAC адрес в HEX файл?
Не знаю в каком разделе задать этот вопрос, поэтому спрошу здесь. Есть файл прошивки в котором уже внесен МАК адрес, но он закодирован. Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru