Pull to refresh

Comments 17

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

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

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

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

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

UFO landed and left these words here

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

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

UFO landed and left these words here

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

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

UFO landed and left these words here
UFO landed and left these words here

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

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

Sign up to leave a comment.

Articles