Проблема с абсолютными адресами

Тема в разделе "WASM.BEGINNERS", создана пользователем Felther, 10 апр 2023.

  1. Felther

    Felther New Member

    Публикаций:
    0
    Регистрация:
    16 май 2022
    Сообщения:
    26
    Всем привет, короче есть следующий код.
    Код (C):
    1. typedef void(*T_TEST)();
    2. void Test()
    3. {
    4. }
    5. typedef struct _FUNCS {
    6.     T_TEST func;
    7. } FUNCS;
    8.  
    9. FUNCS table[] = {
    10.     {Test},
    11.     {Test}
    12. };
    13.  
    14. void Entry()
    15. {
    16.     for (size_t i = 0; i < sizeof(table) / sizeof(FUNCS); ++i)
    17.     {
    18.         table[i].func();
    19.     }
    20. }
    Проблема в том что в table компилятор вставляет абсолютные адреса к функции Test. Програмка так то работает если запускать, из-за того что грузится по imagebase. А я же подгружаю програмку лоадером и соответственно imagebase отличается от дефолта -> крах.
    --- Сообщение объединено, 10 апр 2023 ---
    Разве адреса не должны выщитываться по релокам? Хз, у меня даже эта секция не создается

    P.S. С веткой че та я на мудрил кнечно, но думаю не важно)
    --- Сообщение объединено, 10 апр 2023 ---
    AI предлагает хранить не адреса а оффсеты к функции Test, а при импользвании делать GetModuleHandle(0)+offset. Что вы об этом думаете. Мне как бы код править не особо хочется, т.к код библиотечный
     
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.486
    Адрес:
    Россия, Нижний Новгород
    Видимо, в линкере что-то намудрил, что он их отрезает, потому что если по этому адресу при загрузке либы что-то уже будет, она просто не загрузится - винда тоже не сумеет её релоцировать. И никто не сумеет.
    Поэтому смотри, что у тебя настроено для линкера и в первую очередь верни релоки обратно. А затем в своём лоадере просто пройдись по всем и поправь их, и всё будет работать
     
  3. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.206
    Начать надо с того, чем все это собирается, что за компиль и, соответственно линкер, и потом уже что за опции. Конечно такого быть не должно, должны быть релоки.

    Второй вопрос что за лоадер, если он грузит через LoadLibrary то система может настраивать релоки сама в зависимости от флагов.
    --- Сообщение объединено, 11 апр 2023 ---
    Можно для начала попробовать собрать не .exe а .dll и посмотреть как оно будет грузиться.
     
  4. Felther

    Felther New Member

    Публикаций:
    0
    Регистрация:
    16 май 2022
    Сообщения:
    26
    Да уже решил. Проблема а том, что релоки не создавались из за того, что я по ошибке отключил ASLR