Предполагается не flat модель, т.е. для кода и данных различные жестко заданные по типу сегменты. Как быть с настройкой релоков для PE? Или может быть elf поможет? Умеет ли gcc (не асм) подставлять префиксы переопределения данных по просьбе? Чем подробнее напишите тем лучше. Благодарю.
чтобы загрузить форматный файл, нужен загрузчик в ядре ОС (или что-то, что уже находится в памяти и может выполнить данную операцию) т. е, грубо говоря, загрузить ядро ОС, которое представлено форматным файлом, не получится разве что только написать загрузчик, протранслировать его в binary формат и расположить перед заголовком PE/ELF в целевом файле
rei3er я знаю что нужно чтобы можно было загрузить то что мне надо, вопрос состоит не в этом. Мне и нужен 32-х битный код.
NoName Объясни толком что ты хочешь. А то непонятно. PE проще во Flat грузить. Сам так гружу. А вобще там можно базу установить при компиляции. Правда насколько я понял, тебе нужна возможность размещать иметь 32 битный код с возможностью загрузки на разную базу. Я в этом не разбирался, собственно ты новерно прав нужно будет через релоки делать. Компиляция не должна отличаться. Или надо будет компилировать как Dll не знаю. А дальше все делаешь в соответствии с форматом файла.
Проблем с форматом нету, кроме как с релоками. Проблема заключается в том что при не flat модели, т.е. когда есть, допустим, отдельный сегмент кода и отдельный сегмент данных (и стека) (они не перекрываются) в разных участках памяти, так вот формат релоков PE такого не предусматривает. Т.е. его релоки рассчитаны на то, что код и данные расположены как бы в одном сегменте. А т.к. у нас сегмент данных лежит отдельно, то и адресация в нем никак не совмещена с сегментом кода, поэтому нужно разлечать релоки для кода и данных. Как это сделать? Может ELF умеет?
NoName Тут проблем нет. Если у тебя для каждой задачи есть свой LDT и вней заведен дескрипотры для кода и данных. То релоки не нужны так как учавствует только смещение в аддресации. Через утелиту ld сможешь задать какие хочешь аддреса --section-start SECTION=ADDRESS Set address of named section -Tbss ADDRESS Set address of .bss section -Tdata ADDRESS Set address of .data section -Ttext ADDRESS Set address of .text section А вот если у тебя программы работают в одном аддрестном пространстве используют одни и тежи дискрипотры, то там тоже нет проблем так как притакой организации у тебя все должно быть выравнено и релоки данных и кода будут совподать. Помойму проблема глубже. А именно в том, что все компиляторы пихают в секцию text локальные данные. Такие как текстовые константы.
Для каждой задачи по одному сегменту из трех. LDT нет. Я так понял он тут непричем. только ли gcc может выставлять начальные адреса? А насчет секции text интересно. Наверное только виндовые пихают? Можно сделать сегмент кода с аттрибутом на выполнение и чтение или ты имеешь ввиду проблему адресации? Умеет ли gcc (не асм) подставлять префиксы переопределения данных по просьбе (чтобы задействовать es, fs и gs)?
не умеет только inline-ассемблер + GNU extensions неа GCC все строковые константы размещает в .rodata (read-only data section), ну кроме тех, которыми инициализируются массивы в стеке
Можете пояснить как так получается что часть данных кладется компиляторами (кроме gcc) в секции кода (только си и асм)? Реально ли в cygwin задать для ld -section-start SECTION=ADDRESS?