Обновить

Комментарии 17

А какие современные компиляторы в нативный код используют OMF ?

Очевидно, никакие

Считаю что объектный формат хранения и линковка вообще устаревшие концепции, т.к. они не позволяют хранить метапрограммы (например шаблоны C++), в результате в том же C++ шаблоны могут существовать только в *.h-файлах. Хранить нужно частично скомпилированные синтаксические деревья, а вместо линковки применять процесс «окончательной компиляции».
НЛО прилетело и опубликовало эту надпись здесь
Это если шаблон построен по старинке — и объявления, и реализации в *.h-файлах. Но если оставить в хедерах только объявления, а реализации положить в отдельные файлы *.cpp, то в момент обработки AST шаблоны в последовательность инструкций развернуть не получится. Этим придется заниматься линкеру.
Понятно, что не всякий линкер для этого подойдет. Помнится, солярисовский Sun PRO компилятор именно поэтому использовал свой, интеллектуальный линкер ldi (или ild? Склероз проклятый). Можно было и gcc-шный ld подсунуть, и он даже работал — но ровно до тех пор, пока дело не доходило до линковки с «внешним» шаблонным кодом.

Это очень похоже на модули из C++20

А в TinyC пошли наоборот, сделали ELF и для Windows. Исторически, видимо сложилось.

А что происходит с поддержкой отладчиков и всяких исключений SEH, которые разные для 32 и 64-бит ?

Они не разные

НЛО прилетело и опубликовало эту надпись здесь

Так речь идет об адресации в пределах EXE-файла. Да, там есть команды типа mov rax,<переменная>, т.е. адресация в 8 байтном поле.

И в структурах самой программы полно указателей и прочего. Но в этих случаях старшие 4 байта просто остаются нулевыми, а младшие - нормально настраиваются через имеющийся OMF.

НЛО прилетело и опубликовало эту надпись здесь

А какое преимущество дает загрузка по такому странному адресу 140000000 ? Если оставлять загрузку из IA-32, по крайней мере, можно код короче записать и, да, маленьким прицепом-бонусом можно по-прежнему использовать OMF после пустяшной доделки.

А здесь в чем плюсы? Например, при тестировании я загружал в RSP большое значение и если в недрах системных подпрограмм случайно был оставлен ESP вместо RSP, то в этом месте старшая половина RSP обнулялась и сразу все падало. Удачный тест, но зачем в обычных задачах такое значение стека? Наверное, есть задачи, где свой код требуется отодвинуть в памяти подальше, но большинство задач этого не требует. И, кстати, LLVM и OMF ортогональные вещи. Зачем же отказываться от OMF, который еще 40 лет назад прекрасно позволял собирать выполняемый модуль, не тащя в него библиотеки целиком?

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

А что с вызовами функций из разделяемых библиотек? Ведь нету гарантии, что они будут загружены в нижние 4Гб адресного пространства, а значит нужно будет делать вызовы через восьмибайтные указатели.

Наверное, плохо объяснил. Адрес в 4 байта - это только для адресов-констант, которые известны во время компиляции и действуют "внутри" Exe-файла. А всякие DLL и ALLOCATE - разумеется через адрес в 8 байт, но их настраивать через OMF не нужно.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации