Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
ВнизФормат map файла Найти похожие ветки
← →
Виктор007 (2007-09-05 20:47) [0]Здравствуйте! Пытаюсь разобраться с map файлом генерируемом Delphi.
Мне из Map-файла нужно выудить адрес такой переменной:const
langstrings: array[0..sizeof(langarray)-1] of char = "tr54455777654440";
в файле я нашел следующую строчку:
0002:00013948 langstrings
но вот по адресу 00013948h находится какая-то билиберда. Как узнать по какому смещению в файле программы находится строка tr54455777654440 используя map файл мне непонятно...
← →
Dib@zol © (2007-09-05 21:05) [1]> 00013948h
А с чего ты взял? мож это 00013948d ? Маловероятно, кнешн, но чем чорт не шутит? Или ещё. Ищи не по абсолютному адресу в RAM (ибо это дебилизьм), а относительно начала адресного пространства проги.
← →
DrPass © (2007-09-05 22:47) [2]
> Dib@zol © (05.09.07 21:05) [1]
> Ищи не по абсолютному адресу в RAM (ибо это дебилизьм),
А ты сперва сам попробуй что-либо поискать по абсолютному адресу в RAM, умник :)
← →
Сергей М. © (2007-09-06 08:44) [3]
> Виктор007 (05.09.07 20:47)
Зачем тебе это понадобилось ?
← →
Dib@zol © (2007-09-06 13:44) [4]> [2] DrPass © (05.09.07 22:47)
а ты debug.exe открой, введи абсолютный адрес, и удивись :/
← →
DrPass © (2007-09-06 14:00) [5]
> Dib@zol © (06.09.07 13:44) [4]
И что, он мне покажет что-либо отличное от содержимого памяти в виртуальном адресном пространстве программы ntvdm? 8-)
Нет, конечно, я могу установить на машину оригинальный MS DOS и посмотреть в нем. Но, спрашивается, причем тут Delphi?
← →
Dib@zol © (2007-09-06 14:02) [6]> [5] DrPass © (06.09.07 14:00)
Наверняка, существуют проги и посовременней. Я просто пример привёл.
← →
Anatoly Podgoretsky © (2007-09-06 14:30) [7]00013948h это относительный адрес, к нему наверно надо добавить смещение базы.
← →
Виктор007 (2007-09-06 14:35) [8]В программе используется многоязычность. Сейчас реализовал так:
Фрагмент программы мнооязыковой:
type
Tlanguage = record
S: string[255];
crypt: boolean;
end;
LangArray = array[0..50] of Tlanguage;
....
const
langstrings: array[0..sizeof(Langarray)-1] of char = "tr54455777654440"; //Языковые строки
.....
function TForm1.GetLngStringByID(id: integer): string;
begin
if langarray(langstrings)[id].crypt then
result := DecodeStr(langarray(langstrings)[id].S)
else
result := langarray(langstrings)[id].S;
end;
....
//Установка интерфейса
// Применяем настройки внешнего вида окна.
btnRun.Caption := GetLngStringByID(0);
btnRun.Hint.Text := GetLngStringByID(1);
btnMore.Caption := GetLngStringByID(2);
Фрагмент программы - редактора языков:
// Определение адреса массива строк в файле программы
langstrings.Addr := ScanFile("testproga.exe", "tr54455777654440", false);
// Запись по этому адресу массива строк
...
Seek(f, Client.langstrings.Addr);
BlockWrite(f, langstrings, sizeof(LangArray));
...
Так вот, мне хочется искать не сканируя сам exe файл, а сканируя map файл, т.к. это будет вроде как нагляднее и понятнее...
← →
Виктор007 (2007-09-06 14:40) [9]Т.е. мне это нужно чтобы не применять в программе такие метки
const
langstrings: array[0..sizeof(Langarray)-1] of char = "tr54455777654440";
после чего необходимо приведение типов, а использовать нормальные строкиconst
langstrings: Langarray;
А смещение этой переменной мскать по map файлу а не по метке"tr54455777654440"
Так выглядеть исходник будет понятней и меньше путаницы.
← →
Сергей М. © (2007-09-06 15:19) [10]
> смещение этой переменной мскать по map файлу
Ты что-нибудь про ресурсы исп.файла слышал ?
С языковой конструкцией resourcestring знаком ?
Ведь велосипед изобретаешь) .. С квадратными колесами)
← →
Инс © (2007-09-06 15:20) [11]
> Наверняка, существуют проги и посовременней. Я просто пример
> привёл.
Тут дело не в программе. Операционная система не дает приложениям работать с физическими адресами. А если копнуть еще глубже, то дело даже не в системе, а в принципах защищенного режима работы микропроцессора.
← →
Виктор007 (2007-09-06 15:23) [12]От ресурсов я намеренно отказался - это для меня не подходит. Вопрос у меня стоит про формат map файла, меня это интересует не только со стороны использования языков...
← →
Dib@zol © (2007-09-06 15:29) [13]> [11] Инс © (06.09.07 15:20)
В 98-м debug по-моему реально получает физический доступ к РАМе. Это я взял не с потолка, это было, кажется, у Сергея Симоновича. Была у меня такая книжка "занимательное программирование", для полных ЛМД. Я начинал с неё. И вот там это и было сказано. Так что если что - претензии не ко мне.
← →
Anatoly Podgoretsky © (2007-09-06 15:31) [14]> Dib@zol (06.09.2007 15:29:13) [13]
Большинство, которые читают такие книги, такими и остаются на всю жизнь.
← →
Инс © (2007-09-06 15:34) [15]
> Anatoly Podgoretsky © (06.09.07 15:31) [14]
Радует, что "вся жизнь" у парня еще впереди, так что ситуация поправима.
← →
Dib@zol © (2007-09-06 15:35) [16]> [14] Anatoly Podgoretsky © (06.09.07 15:31)
Извините конечно, но начать сразу, скажем с Фаронова, я не мог. Нужны были хоть какие-то азы.
← →
Инс © (2007-09-06 15:37) [17]
> скажем с Фаронова
Фаронов - это в принципе тоже база. Ничего сверхъестественного в его книгах нет, но несмотря на это они достаточно хорошего качества.
← →
Сергей М. © (2007-09-06 15:39) [18]
> От ресурсов я намеренно отказался - это для меня не подходит
Любопытно было бы узнать почему ..
> Вопрос у меня стоит про формат map файла
Он прост до безобразия:
Секция:Смещение СимвольныйИдентификатор
← →
Виктор007 (2007-09-06 16:19) [19]> Любопытно было бы узнать почему ...
Если пихать все в ресурсы то приложение на пару килобайт будет больше.
Да, разобрался, в моем случае
0002:00013948 langstrings
Смещение в файле данных этой константы находится по адресу:
Смещение секции DATA + 00013948 = 2D400 + 13948 = 40D48
Мне как раз и нужен был этот адрес.
← →
Anatoly Podgoretsky © (2007-09-06 16:36) [20]> Виктор007 (06.09.2007 16:19:19) [19]
Этот адрес определяется в момент загрузки приложения.
← →
Сергей М. © (2007-09-06 16:40) [21]
> Если пихать все в ресурсы то приложение на пару килобайт
> будет больше.
>
Еще один ловец блох)
Ну и что ?
Что такое 2К при современных гигабайтных исполняемых модулях ?
Слону дробина ?)
> Смещение в файле данных этой константы находится по адресу
Смещение секции не постоянно и определяется PE-загрузчиком в ран-тайм.
← →
Dib@zol © (2007-09-06 16:50) [22]> гигабайтных исполняемых модулях
ЧЁ??? <8() Это ты про установочные комплекты?
← →
Сергей М. © (2007-09-06 16:52) [23]
> Dib@zol © (06.09.07 16:50) [22]
> ЧЁ???
Тебя это не касается)
← →
Dimaxx © (2007-09-06 17:39) [24]
> Фрагмент программы мнооязыковой:
>
> type
> Tlanguage = record
> S: string[255];
> crypt: boolean;
> end;
> LangArray = array[0..50] of Tlanguage;
> ....
> const
> langstrings: array[0..sizeof(Langarray)-1] of char = "tr54455777654440";
> //Языковые строки
>
> .....
> function TForm1.GetLngStringByID(id: integer): string;
> begin
> if langarray(langstrings)[id].crypt then
> result := DecodeStr(langarray(langstrings)[id].S)
> else
> result := langarray(langstrings)[id].S;
> end;
>
> ....
> //Установка интерфейса
> // Применяем настройки внешнего вида окна.
> btnRun.Caption := GetLngStringByID(0);
> btnRun.Hint.Text := GetLngStringByID(1);
> btnMore.Caption := GetLngStringByID(2);
>
>
> Фрагмент программы - редактора языков:
>
> // Определение адреса массива строк в файле программы
> langstrings.Addr := ScanFile("testproga.exe", "tr54455777654440",
> false);
> // Запись по этому адресу массива строк
> ...
> Seek(f, Client.langstrings.Addr);
> BlockWrite(f, langstrings, sizeof(LangArray));
> ...
>
>
> Так вот, мне хочется искать не сканируя сам exe файл, а
> сканируя map файл, т.к. это будет вроде как нагляднее и
> понятнее...
>
Такого бреда еще не видел. Море реализаций многоязыковых приложений, но этот нуна в орешник прямой дорогой...
← →
Виктор007 (2007-09-06 18:46) [25]Мдям, что-то не получилось как я хотел...
Такая запись не проходит,const
langstrings: langarray;
Пришлось так оставитьconst
langstrings: array[0..sizeof(langarray)-1] of char = "";
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.049 c