Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

Формат 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.025 c
15-1188495169
Kolan
2007-08-30 21:32
2007.09.30
Что за кодировка: &amp;laquo;РЁСЂСЌРє Третий&amp;raquo; ?


1-1184934235
Mitrofan
2007-07-20 16:23
2007.09.30
Отладка нитей в Delphi


2-1189059357
Bast
2007-09-06 10:15
2007.09.30
---------------


15-1188536993
boriskb
2007-08-31 09:09
2007.09.30
почему все же гудят высоковольтные провода и многое другое


2-1188813839
Lyberzon
2007-09-03 14:03
2007.09.30
Как загрузить из INI список секций в ComboBox?