Расчитать смещение функции от структуры в компайл-тайме

Тема в разделе "LANGS.C", создана пользователем Rel, 4 мар 2020.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.895
    Не могу никак сообразить. Хочу сделать структуру и положить в нее смещения функций, относительно этой структуры. При этом смещения должны попасть в данные исполняемого файла, а не быть вычисленными в рантайме. То есть, должны быть вычисленны на этапе компиляции, например:
    Код (Text):
    1.  
    2. struct FuncOffsets {
    3.     DWORD Func1Offset;
    4.     DWORD Func2Offset;
    5.     // ....
    6. };
    7.  
    8. static FuncOffsets funcOffsets = {
    9.     (DWORD)(ULONGLONG)((PBYTE)&funcOffsets - (PBYTE)Func1),  
    10.     (DWORD)(ULONGLONG)((PBYTE)&funcOffsets - (PBYTE)Func2),
    11.     // ....
    12. };
    13.  
    Проблема в том, что компиль никак не хочет их высчитывать на этапе компиляции. Вероятно, это в принципе невозможно, тк адреса функции и статические структуры получают на этапе линковки, и компиль собственно про них ничего не знает. Но вдруг это все же можно сделать, что думаете?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.796
    Наверное разгадка в том, что цэ однопроходной и на первом и единственном проходе он их правда не может посчитать. Пиши на фасме, он и не на такую муть способен.
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.895
    Я бы сказал, что це скорее заднепроходной. Проблема в том, что мне нужно один кодец компилить под i686 и x64, на асме писать две версии лениво, да и давно я этого не делал, накосячу на ровном месте. Зиг еще не созрел для тех задач, которые я решаю через це, а другие альтернативы не особо годяться в принципе к сожалению. Так что для этой задачи нужен пресловутый це.
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.796
    Ну заполни структуру указателями, потом бинарник обработаешь как надо чем-нибудь, заменишь на оффсеты относительно структуры.
     
  5. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.599
    Адрес:
    г. Санкт-Петербург
    Из-за ASLR вряд ли получится сделать это статически.
    https://habr.com/ru/company/badoo/blog/323904/
    --- Сообщение объединено, 4 мар 2020 ---
    И, кстати, что за задачи такие, что приходится такими дикими извращениями решать?
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.528
    Адрес:
    Russia
    Лет так 10 назад, такие задачи даже без ASLR - делали всегда постпроцессингом так , как сказал f13nd
     
  7. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    947
    компиль то какраз всё понимае: если нужно пометить фунцию то сделай рядом __declspeс(naked) jmp или _attribute((naked)куда нибудь, чтобы линкер увязал (ну или как вы там в своих гсс и сланге)
    --- Сообщение объединено, 7 мар 2020 ---
    __attribute__ итд
    --- Сообщение объединено, 8 мар 2020 ---
    это просто специализация ко внешнему связыванию
    --- Сообщение объединено, 8 мар 2020 ---
    а что касается имён в глобальном неймспейсе, то если у них есть члены с конструкторами, то разумеется что компилятор простроит ветвь с их вызовами.
    --- Сообщение объединено, 8 мар 2020 ---
    иными словами - если у тебя есть член класса со своим конструктором, то компилер нагенерит код, которого ты даже не ожидаешь, чтобы в итоге вызвать цтор члена класса.
    --- Сообщение объединено, 8 мар 2020 ---
    вот тащемта и вся фигня, которая Гвидо ненра
    --- Сообщение объединено, 8 мар 2020 ---
    удолите предыдущий пост, имхо бред.
    --- Сообщение объединено, 8 мар 2020 ---
    удолите, пжалста
    --- Сообщение объединено, 8 мар 2020 ---
    ты можешь запилить статик юнион например как глобальный экземряр, но то что неопределено - ты можешь лишь ссылаться на это, компилер то поймёт, а вот линкер при редакции связей вовсе нет. ты же тут динамическую инициализацию пилешь.
     
    Последнее редактирование: 7 мар 2020