Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.52 MB
Время: 0.045 c
15-1188824781
Инс
2007-09-03 17:06
2007.09.30
Про кульхацкеров.


2-1188888869
VRSB
2007-09-04 10:54
2007.09.30
NMStrmServ


15-1188733499
самовар
2007-09-02 15:44
2007.09.30
Как соединить в локальную сеть два здания на расстоянии


6-1170322016
viper7
2007-02-01 12:26
2007.09.30
IdTCPClient1.ReadStrings глюк или я непонимаю


15-1188749345
JaK[Light]
2007-09-02 20:09
2007.09.30
Wanted! Книги....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский