Как связать местов сорце с местом в PE файле?

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 19 мар 2011.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Допустим есть такое
    Код (Text):
    1. //.................
    2. char str[1024];
    3. //.................
    Как можно узнать в каком байте PE файла начинается DWORD с RVA или VA,на эту переменную?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В общем случае никак. А зачем?
     
  3. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    в чем пишете?
     
  4. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    Код (Text):
    1. //.................
    2. __declspec(dllexport) char str[1024];
    3. //.................
    Код (Text):
    1. //.................
    2. #pragma data_seg(push, "str")  
    3. char str[1024];
    4. #pragma data_seg(pop)
    5. //.................
     
  5. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    никак если файл с релоками
    если без можно захардкодить адрес константой
    адрес массива адрес функции ничего не узнать
    пока загрузчик не пофиксит все ссылки на данные/функции
    например есть такой код
    void(*ppjo)() = &asdfgh;
    0041161E C7 45 F0 5A 10 41 00 mov dword ptr [ppjo],offset asdfgh (41105Ah)
    если 0x00400000 это база то 1105a это смещение
    которое надо добавить к новой базе и исправить код
    если новая база будет например 0x10000000 то пофиксится так
    0041161E C7 45 F0 5A 10 01 10 mov dword ptr [ppjo],offset asdfgh (1001105Ah)
     
  6. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    В том то и дело что мне нужно узнать,что представляет из себя переменная пока её загрузчик не "пофиксил".
     
  7. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    ну тогда бери va переменной/функции/массива
    вычитай из него базу получиш rva этих сущностей
    va глобального массива например
    char buf[];
    &buf если релоков нет то он таким и останется
     
  8. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Сгенерить map-файл или отладочную информацию и пересчитать RVA в смещение в файле? Хотя если эта хрень на стеке, её в PE вообще не будет.
     
  9. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.624
    Адрес:
    Russia
    _nic
    отлаживайте загрузчик
     
  10. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Если бы все так было тривиально :dntknw: Но меня интересует перменная статического TLS.При одной и той же базе загрузчик каждый раз пишет туда разные VA.Вот меня и интересует что там было до того как он пофиксил.
     
  11. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    нет.

    osox прав.

    компилишь слитно секции, вычитаешь разницу с базы во время рантайма с учетом смещения на стадии компиляции.
     
  12. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Это что за такая уличная магия???Какое смещение при компиляции???