Вот народ подскажите есть проект он рекампилится по разному какую прагму добавить чтобы ентрипоинт был всегда один и тот же вне зависимости от изменений проекта, пересекающихся параграфов нет
sl0n Имхо задача не имеет решения, если условие "рекампилится по разному". Потому, что компиль компилю рознь. Но если компиль один и тот же, то действительно, если зафиксировать ордер функций, есть вероятность, что RVA EP будет одной и той же. ИМХО
Если программу собрать без c-шного рантайма и указать опцию /ENTRY для линкера - то один и тот же. Ещё вариант (если лень возится с /ORDER и очередностью функций): повесить на post build event программу, которая будет в заведомо известное место (заголовок, начало первой секции, итд.) писать jmp на OEP, и RVA точки входа в загловке переписывать адресом этого джампа.
вообще мне кажется, что надежно это можно сделать только /ORDER... /ENTRY привяжет точку входа к имени функции, он не фиксирует ее RVA... можно канеш вынести EntryPoint в отдельну секцию и каким-нить образом поставить ее до всех остальных секций, но это - бредовое решение... можно с помощью ассемблера сделать стаб в самом начале секции кода, но надо, чтобы obj-файл этого стаба попадал на линкер первым... а из этого стаба уже вызывать оригинальную точку входа или CRT-точку входа... я делал такую тему с помощью yasm'а...
мелкомягкий линкер собирает обжухи по имени, так что называй свой модуль "__!!!_module", и он будет в начале сакции кода. главное выгнать оттуда всякие баунд-импорты и прочую ересь =)
я может какой-то особенный, но у меня линкер пихает обжы в том порядке, в котором они добавлялись в проект, а не по алфавиту (студия 2008 и 2010)...
#pragma comment(linker, "/ENTRY:name_of_func") #pragma comment(linker, "/BASE:0x12130000") минус 1 в том что по этому адресу не должно ничего находиться - ибо чревато крахом минус 2 - инита црт не произойдет
они и не будут совпадать - я говорю о том что вдруг по этой базе уже чтото выделено. библя какая например.
именно по этой причине есть стандартная ImageBase для exe-файлов... именно по этой причине dll-файлы обычно снабжены релоками... и потом, о чем мы говорим, если это не решает задачу: вне зависимости от фиксации базы, ведь: