Не могу никак сообразить. Хочу сделать структуру и положить в нее смещения функций, относительно этой структуры. При этом смещения должны попасть в данные исполняемого файла, а не быть вычисленными в рантайме. То есть, должны быть вычисленны на этапе компиляции, например: Код (Text): struct FuncOffsets { DWORD Func1Offset; DWORD Func2Offset; // .... }; static FuncOffsets funcOffsets = { (DWORD)(ULONGLONG)((PBYTE)&funcOffsets - (PBYTE)Func1), (DWORD)(ULONGLONG)((PBYTE)&funcOffsets - (PBYTE)Func2), // .... }; Проблема в том, что компиль никак не хочет их высчитывать на этапе компиляции. Вероятно, это в принципе невозможно, тк адреса функции и статические структуры получают на этапе линковки, и компиль собственно про них ничего не знает. Но вдруг это все же можно сделать, что думаете?
Наверное разгадка в том, что цэ однопроходной и на первом и единственном проходе он их правда не может посчитать. Пиши на фасме, он и не на такую муть способен.
Я бы сказал, что це скорее заднепроходной. Проблема в том, что мне нужно один кодец компилить под i686 и x64, на асме писать две версии лениво, да и давно я этого не делал, накосячу на ровном месте. Зиг еще не созрел для тех задач, которые я решаю через це, а другие альтернативы не особо годяться в принципе к сожалению. Так что для этой задачи нужен пресловутый це.
Ну заполни структуру указателями, потом бинарник обработаешь как надо чем-нибудь, заменишь на оффсеты относительно структуры.
Из-за ASLR вряд ли получится сделать это статически. https://habr.com/ru/company/badoo/blog/323904/ --- Сообщение объединено, 4 мар 2020 --- И, кстати, что за задачи такие, что приходится такими дикими извращениями решать?
компиль то какраз всё понимае: если нужно пометить фунцию то сделай рядом __declspeс(naked) jmp или _attribute((naked)куда нибудь, чтобы линкер увязал (ну или как вы там в своих гсс и сланге) --- Сообщение объединено, 7 мар 2020 --- __attribute__ итд --- Сообщение объединено, 8 мар 2020 --- это просто специализация ко внешнему связыванию --- Сообщение объединено, 8 мар 2020 --- а что касается имён в глобальном неймспейсе, то если у них есть члены с конструкторами, то разумеется что компилятор простроит ветвь с их вызовами. --- Сообщение объединено, 8 мар 2020 --- иными словами - если у тебя есть член класса со своим конструктором, то компилер нагенерит код, которого ты даже не ожидаешь, чтобы в итоге вызвать цтор члена класса. --- Сообщение объединено, 8 мар 2020 --- вот тащемта и вся фигня, которая Гвидо ненра --- Сообщение объединено, 8 мар 2020 --- удолите предыдущий пост, имхо бред. --- Сообщение объединено, 8 мар 2020 --- удолите, пжалста --- Сообщение объединено, 8 мар 2020 --- ты можешь запилить статик юнион например как глобальный экземряр, но то что неопределено - ты можешь лишь ссылаться на это, компилер то поймёт, а вот линкер при редакции связей вовсе нет. ты же тут динамическую инициализацию пилешь.