Формат MAP-файла, генерируемый компилятором или линкеро

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение Cheb » 28.01.2008 03:21:42

З.Ы. Устал, завтра на работу. Попробую как-то на недельке добить. Там немного осталось - на основе распакованной информации найти по адресу строку, столбец и имя исходника не сможет только слепоглухотупой. Единственный минус - надо ещё где-то отковырять базовый адрес dll'ы, чтобы прибавить к этим адресам из таблицы.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 29.01.2008 13:11:42

Балда я двухсотеросовая. Под самым носом же лежало!
Функция dladdr() из модуля dl как раз и предназачена чтобы информацию о дллах узнавать - включая базовый addr.

[напевает "не нужен нам VirtualQuery турецкий..."]
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 29.01.2008 13:45:26

Урра! Заработала! :D
dll'а сама сбя пропарсила и доложила номер строки с ошибкой!

Код: Выделить всё
МОДУЛЬ lib_test013.so РУХНУЛ
Крах модуля: непойманное исключение,
  Access Violation
Код по адресу 005AE48Eh
   (исходник mo_module.pp
    позиция 208:3)
  превысил свои права на доступ
  к какой-то из страниц виртуальной памяти.
Как правило такое случается при обращении
  к несуществующим данным (ещё не созданному
  или уже уничтоженному экземпляру класса,
  неинициализированному указателю, пустой строке
  или динамическому массиву нулевой длины и т.п.)


Вечерком подгоню в пользование общественностью, а то оно у меня кучу функций движка использует.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 29.01.2008 22:18:29

Хорошая новость: Фри Паскаль генерирует-таки отладочную информацию dwarf для виндовских екзешников!

Осталось лишь научиться её выковыривать - когда закончу, точно выложу модули для пользования общественностью... и мне в благодарность поставят памятник из чистого золота... в натуральную величину... :roll:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 29.01.2008 23:17:50

Всё, умри всё живое. :twisted: Выковырял разбиратор PE из старого модуля lineinfo 2000 года, прикрутил... Выковыривает. Имя секции со строками оказалось "/30"

Самая большая ложка дёгтя - вся эта байда и смартлинкинг - две вещи несовместные. В результате екзешники получаются... увесистые. :(
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Alexx2000 » 30.01.2008 01:56:26

Интересная затея...
Так это дело где будет работать, в Windows или Linux, или там и там. (в начале написано вроде про elf32, сейчас про pe)?
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 489
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Сообщение Cheb » 30.01.2008 05:29:11

И там, и там! :D
И уже работает - написал и отладил. Осталось лишь, как я уже сказал, выкромсать из моего движка, некоторые функции которого оно использует.

Основная идея - даётся утилита, которой обрабатывается exeшник, после чего он очищается strip'ом. Дело в том, что -gw помимо информации о строках генерирует ещё море ненужного мусора (пример: строки - 50 кб, вся отладочная инфа в целом - 400кб ).
Короче, информацию о строках, имо, лучше хранить параллельно, в отдельном файле.

В принципе, Лазарь позволяет с лёгкостью пристегнуть всё это скриптами (секции "до компиляции"/"после компиляции").
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 31.01.2008 08:01:14

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

И вот эта вот процедура, по адресу эксцепшена вычисляющая имя исполняегого файла (exe или одна из загруженных им dll) а также базовый адрес, под пингвинами у меня дала сбой:

Код: Выделить всё
  procedure GetModuleByAddr(addr: pointer; var baseaddr: pointer; var filename: string);
  {$ifdef unix}
  var
    dlinfo: dl_info;
  begin
    FillChar(dlinfo, sizeof(dlinfo), 0);
    dladdr(addr, @dlinfo);
    baseaddr:= dlinfo.dli_fbase;
    filename:= String(dlinfo.dli_fname);
    if filename = ParamStr(0) then baseaddr:= nil;
  end;
  {$else}
  var
    Tmm: TMemoryBasicInformation;
    TST: array[0..Max_Path] of Char;
  begin
    if VirtualQuery(addr, @Tmm, SizeOf(Tmm)) <> sizeof(Tmm)
      then raise Exception.Create('The VirualQuery() call failed.');
    baseaddr:=Tmm.AllocationBase;
    TST[0]:= #0;
    GetModuleFileName(THandle(Tmm.AllocationBase), TST, SizeOf(TST));
    filename:= String(PChar(@TST));
    if filename = ParamStr(0) then baseaddr:= nil;
  end;
  {$endif} 


Причина - самая дурацкая. dladdr выдаёт истинное имя файла, разворачивая все симлинки, а ParamStr(0) - нет!
Не знает кто надёжной функции в RTL которая отслеживала бы симлинк до основания?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 31.01.2008 10:28:10

Забавно наблюдать за за следами оптимизации в отладочном выводе парсера (особенно на больших математических формулах): адреса даются строго по возрастающей, а соответствующие им номера строк и столбцов скачут как зайцы. 404-309-403-309-400, например.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 06.02.2008 18:45:15

Разработка идёт. Уже собирался выкладывать, когда обнаружил две засады:

А). Не учитывается возможность релокации dll под Win32. Но это легко доработать.
Б). Утилита strip, паскуда, *не умеет* вырезать из екзешников отладочную информацию dwarf, оставляя внутри тону мусора. :evil: Пишу свой strip, более эффективный. 8) Под вайном результат его самодеятельности уже запускается, осталось проверить под настоящим маздаем.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Sergei I. Gorelkin » 06.02.2008 21:04:20

Я понимаю, что могу показаться (или оказаться) ведром ледяной воды на голову, но сказать об этом все-таки стоит.
В курсе, что разработчики недавно добавили ключ -Xg, который отладочную инфу пишет сразу в отдельный файл, а в екзешнике оставляет ссылку на него?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Cheb » 06.02.2008 22:37:47

Какое, нафик, ведро?
Лучше новости я ещё не слыхал! :D
[с радостью вычищает из своей либы процедуры стрипанья, и прыгает на их останках]
Дела мне другого нет чтоли как уже имеющееся повторять?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 06.02.2008 22:42:50

Ээ... беру свои слова обратно. [возвращает процедуру на место, отряхивая с неё пыль] .dbg файл здоровый, раза три больше того, что яполучаю выдираньем dwarf line info. И где можно узнать про его формат?

Да и свой стрип, в исходниках, иметь не помешает - мало ль, кому пригодится. До полностью рабочего состояния я его уже довёл, полученный екзешник даже upx жрёт не подавившись.

Хммм... А интересная идея - чтобы не плодить тучу файла, стрипаешь, upx'аешь, а потом dwarf line info вставляешь обратно. Ведь из upx'нутого файла её не выцарапаешь, он всё вместе жмёт.

И вообще, exe файл, как оказалось, такая интересная штука - прямо набор кубиков, перебирай - не хочу.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 08.02.2008 23:02:57

Короче, чувствую, замотаюсь и не знаю, когда ещё руки дойдут.

Вылолжил пока что есть: http://www.chebmaster.narod.ru/soft/libs_chelinfo.html

Вроде бы, работает.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Attid » 09.02.2008 00:49:52

надо бы в сообщество толкнуть, киньте ссылку кто в подписке на фпц. мож там идеи есть полезные . . .
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru