![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Формат map файла
Виктор007 © (2007-09-05 20:47:00)Здравствуйте! Пытаюсь разобраться с map файлом генерируемом Delphi.
Мне из Map-файла нужно выудить адрес такой переменной:
const
langstrings: array[0..sizeof(langarray)-1] of char = 'tr54455777654440';
в файле я нашел следующую строчку:
0002:00013948 langstrings
но вот по адресу 00013948h находится какая-то билиберда. Как узнать по какому смещению в файле программы находится строка tr54455777654440 используя map файл мне непонятно...
Виктор007 (2007-09-06 18:46:00) [1]Мдям, что-то не получилось как я хотел...
Такая запись не проходит,
const
langstrings: langarray;
Пришлось так оставить
const
langstrings: array[0..sizeof(langarray)-1] of char = '';
Dimaxx (2007-09-06 17:39:00) [2]
> Фрагмент программы мнооязыковой:
>
> 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 файл, т.к. это будет вроде как нагляднее и
> понятнее...
>
Такого бреда еще не видел. Море реализаций многоязыковых приложений, но этот нуна в орешник прямой дорогой...
Сергей М. (2007-09-06 16:52:00) [3]
> Dib@zol © (06.09.07 16:50) [22]
> ЧЁ???
Тебя это не касается)
Dib@zol (2007-09-06 16:50:00) [4]> гигабайтных исполняемых модулях
ЧЁ??? <8() Это ты про установочные комплекты?
Сергей М. (2007-09-06 16:40:00) [5]
> Если пихать все в ресурсы то приложение на пару килобайт
> будет больше.
>
Еще один ловец блох)
Ну и что ?
Что такое 2К при современных гигабайтныхисполняемых модулях ?
Слону дробина ?)
> Смещение в файле данных этой константы находится по адресу
Смещение секции не постоянно и определяется PE-загрузчиком в ран-тайм.
Anatoly Podgoretsky (2007-09-06 16:36:00) [6]> Виктор007 (06.09.2007 16:19:19) [19]
Этот адрес определяется в момент загрузки приложения.
Виктор007 (2007-09-06 16:19:00) [7]> Любопытно было бы узнать почему ...
Если пихать все в ресурсы то приложение на пару килобайт будет больше.
Да, разобрался, в моем случае
0002:00013948 langstrings
Смещение в файле данных этой константы находится по адресу:
Смещение секции DATA + 00013948 = 2D400 + 13948 = 40D48
Мне как раз и нужен был этот адрес.
Сергей М. (2007-09-06 15:39:00) [8]
> От ресурсов я намеренно отказался - это для меня не подходит
Любопытно было бы узнать почему ..
> Вопрос у меня стоит про формат map файла
Он прост до безобразия:
Секция:Смещение СимвольныйИдентификатор
Инс (2007-09-06 15:37:00) [9]
> скажем с Фаронова
Фаронов - это в принципе тоже база. Ничего сверхъестественного в его книгах нет, но несмотря на это они достаточно хорошего качества.
Dib@zol (2007-09-06 15:35:00) [10]> [14] Anatoly Podgoretsky © (06.09.07 15:31)
Извините конечно, но начать сразу, скажем с Фаронова, я не мог. Нужны были хоть какие-то азы.
Инс (2007-09-06 15:34:00) [11]
> Anatoly Podgoretsky © (06.09.07 15:31) [14]
Радует, что "вся жизнь" у парня еще впереди, так что ситуация поправима.
Anatoly Podgoretsky (2007-09-06 15:31:00) [12]> Dib@zol (06.09.2007 15:29:13) [13]
Большинство, которые читают такие книги, такими и остаются на всю жизнь.
Dib@zol (2007-09-06 15:29:00) [13]> [11] Инс © (06.09.07 15:20)
В 98-м debug по-моему реально получает физический доступ к РАМе. Это я взял не с потолка, это было, кажется, у Сергея Симоновича. Была у меня такая книжка "занимательное программирование", для полных ЛМД. Я начинал с неё. И вот там это и было сказано. Так что если что - претензии не ко мне.
Виктор007 (2007-09-06 15:23:00) [14]От ресурсов я намеренно отказался - это для меня не подходит. Вопрос у меня стоит про формат map файла, меня это интересует не только со стороны использования языков...
Инс (2007-09-06 15:20:00) [15]
> Наверняка, существуют проги и посовременней. Я просто пример
> привёл.
Тут дело не в программе. Операционная система не дает приложениям работать с физическими адресами. А если копнуть еще глубже, то дело даже не в системе, а в принципах защищенного режима работы микропроцессора.
Сергей М. (2007-09-06 15:19:00) [16]
> смещение этой переменной мскать по map файлу
Ты что-нибудь про ресурсы исп.файла слышал ?
С языковой конструкцией resourcestringзнаком ?
Ведь велосипед изобретаешь) .. С квадратными колесами)
Виктор007 (2007-09-06 14:40:00) [17]Т.е. мне это нужно чтобы не применять в программе такие метки
const
langstrings: array[0..sizeof(Langarray)-1] of char = 'tr54455777654440';
после чего необходимо приведение типов, а использовать нормальные строки
const
langstrings: Langarray;
А смещение этой переменной мскать по map файлу а не по метке'tr54455777654440'
Так выглядеть исходник будет понятней и меньше путаницы.
Виктор007 (2007-09-06 14:35:00) [18]В программе используется многоязычность. Сейчас реализовал так:
Фрагмент программы мнооязыковой:
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 файл, т.к. это будет вроде как нагляднее и понятнее...
Anatoly Podgoretsky (2007-09-06 14:30:00) [19]00013948h это относительный адрес, к нему наверно надо добавить смещение базы.
Dib@zol (2007-09-06 14:02:00) [20]> [5] DrPass © (06.09.07 14:00)
Наверняка, существуют проги и посовременней. Я просто пример привёл.