Для личного проекта мне нужно написать исполняемый файл, который загружается не по адресу памяти по умолчанию. Из этого вопроса SO я знаю, что могу установить адрес входа для ELF и изменить адреса разделов вручную, чтобы исполняемый файл эффективно базировался на каком-то выбранном мной адресе. Однако ответ предполагает, что это работает только в том случае, если я не инициализирую glibc (что мне нужно для этого проекта), и установка адресов памяти разделов каждый раз при компиляции будет сложной (не говоря уже об утомительной).
Кажется, должен быть лучший способ установить базовый адрес для ELF при сборке, хотя я прибегну к этому вручную с помощью скрипта после сборки, если это необходимо. Этот вариант для ld
был бы идеальным, если бы он не был специфичен для порта PE:
--image-base value
Use value as the base address of your program or dll. This is the lowest
memory location that will be used when your program or dll is loaded. To
reduce the need to relocate and improve performance of your dlls, each should
have a unique base address and not overlap any other dlls. The default is
0x400000 for executables, and 0x10000000 for dlls. [This option is specific
to the i386 PE targeted port of the linker]
Я еще не нашел эквивалент ELF. Не существует? Самостоятельный разбор файла ELF не был бы концом света, но похоже, что эта функция должна где-то существовать.
ld
илиgcc
. Можете ли вы уточнить или направить меня к нужной документации? - person emprice   schedule 09.03.20130x200000
или0x500000
), но не другие (например,0x100000
); когда это не работает, программа убивается. Есть ли какое-то ограничение на то, какие адреса я могу использовать (помимо адресов ядра)? - person emprice   schedule 10.03.20130x400000
для отображения памяти, поэтому мне нужно, чтобы мой исполняемый файл загружался где-то в стороне. - person emprice   schedule 10.03.2013