Re[11]: длинный переход (глобальные метки)
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 31.03.02 16:52
Оценка:
Здравствуйте whiteForest, Вы писали:

Исправлена подсветка синтаксиса. -- ПК.

Как верно сказал adontz, в лоб решения не видно.

Но можно сделать криво:
1.
void fun1
{
 __asm
 {
   jmp q;
   DB "Label1"
   q:
    bla-bla-bla
 }
}


Потом найти в коде слово Label1
void main()
{
  find ("Label1", &fun1, &main);
}


2.
int arr[100];
int arr_i = 0;

void fun1()
{
  __asm
  {
    mov arr[arr_i++], $;
    bla-bla-bla
  }
}


Повызывать все функции, они сами заполнят массив

void main()
{
  fun1();
  for (int i = 0; i < arr_i; ++i)
  {
    std::cout << arr[i] << "\n";
  }
}


3. Разобрать символьную информацию, который пихает компилятор для debugger-а.
В частности информацию о том, для какой линии C-кода, какой адрес соответствует.

Причем эту информацию можно получить и для Release-версии.

Компиляем Release с добавлением Debug-информации.
Разбираем Debug-информацию и на ее основание патчим exe-шник, заполняя какой-нибудь массив.
С помощью Strip-а убераем Debug-информацию.

3 путь мне кажется самым перспективным, т.к. исходную программу можно не менять.
Будет проблема с макросами, т.к. внутри макроса номер строки один, но и это можно победить, прогнав сначала код отдельно через препроцессор, а только потом компилировать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.