LINUX.ORG.RU

История изменений

Исправление X512, (текущая версия) :

Кстати, если PE формат лучше чем ELF, то почему его не используют в linux?

Как минимум по идеологическим причинам: «это же формам винды!». Также в PE нет встроенных релокаций по произвольному адресу, но MinGW реализует свой механизм релокаций. Это сейчас не так актуально, т.к. во многих дистрибутивах используют ‘-fpic’ и импортированные символы в итоге записываются в таблицу GOT или IAT. С PE есть ещё трудность что экспортированные символы надо явно объявлять, но опять же в Линуксе с ELF уже идут по этому же пути и некоторые пакеты (например Mesa3d) собираются с -fvisibility=hidden.

Я пробовал сделать компиляцию и запуск PE модулей в Haiku и совместное использование PE и ELF. Удалось чтобы что-то работало, но столкнулся с мелкими несовместимостями ABI. Во первых MinGW почему-то передаёт this в регистре ECX, хотя используется Itanium C++ ABI. В компиляции в ELF this передаётся через стек. Во вторых в ELF для методов возвращающих структуры используется смешанное соглашение вызовов: аргументы освобождаются вызывающим, а возвращаемая структура вызываемым. В MinGW всё освобождается вызывающим. Первую проблему а смог починить в исходниках Clang, а вторую так и не смог найти где надо чинить. В результате работает только код, не возвращающий структуры. Если вернуть структуру, то будет испорчен стек.

Я экспериментировал с 32 битами, возможно в 64 битах таких проблем нет.

Кстати в BeOS (предшественнике Haiku) одно время использовался формат PE для платформы x86, но потом перешли на ELF, видимо из-за лучшей доступности компилятора (GCC). В PE использовали Microsoft C++ ABI, но свой формат ресурсов и исключений.

Исправление X512, :

Кстати, если PE формат лучше чем ELF, то почему его не используют в linux?

Как минимум по идеологическим причинам: «это же формам винды!». Также в PE нет встроенных релокаций по произвольному адресу, но MinGW реализует свой механизм релокаций. Это сейчас не так актуально, т.к. во многих дистрибутивах используют ‘-fpic’ и импортированные символы в итоге записываются в таблицу GOT или IAT. С PE есть ещё трудность что экспортированные символы надо явно объявлять, но опять же в Линуксе с ELF уже идут по этому же пути и некоторые пакеты (например Mesa3d) собираются с -fvisibility=hidden.

Я пробовал сделать компиляцию и запуск PE модулей в Haiku и совместное использование PE и ELF. Удалось чтобы что-то работало, но столкнулся с мелкими несовместимостями ABI. Во первых MinGW почему-то передаёт this в регистре ECX, хотя используется Itanium C++ ABI. В компиляции в ELF this передаётся через стек. Во вторых в ELF для методов возвращающих структуры используется смешанное соглашение вызовов: аргументы освобождаются вызывающим, а возвращаемая структура вызываемым. В MinGW всё освобождается вызывающим. Первую проблему а смог починить в исходниках Clang, а вторую так и не смог найти где надо чинить. В результате работает только код, не возвращающий структуры, если вернуть структуру, то будет испорчен стек.

Я экспериментировал с 32 битами, возможно в 64 битах таких проблем нет.

Кстати в BeOS (предшественнике Haiku) одно время использовался формат PE для платформы x86, но потом перешли на ELF, видимо из-за лучшей доступности компилятора (GCC). В PE использовали Microsoft C++ ABI, но свой формат ресурсов и исключений.

Исправление X512, :

Кстати, если PE формат лучше чем ELF, то почему его не используют в linux?

Как минимум по идеологическим причинам: «это же формам винды!». Также в PE нет встроенных релокаций по произвольному адресу, но MinGW реализует свой механизм релокаций. Это сейчас не так актуально, т.к. во многих дистрибутивах используют ‘-fpic’ и импортированные символы в итоге записываются в таблицу GOT или IAT. С PE есть ещё трудность что экспортированные символы надо явно объявлять, но опять же в Линуксе с ELF уже идут по этому же пути и некоторые пакеты (например Mesa3d) собираются с -fvisibility=hidden.

Я пробовал сделать компиляцию и запуск PE модулей в Haiku и совместное использование PE и ELF. Удалось чтобы что-то работало, но столкнулся с мелкими несовместимостями ABI. Во первых MinGW почему-то передаёт this в регистре ECX, хотя используется Itanium C++ ABI. В компиляции в ELF this передаётся через стек. Во вторых в ELF для методов возвращающих структуры используется смешанное соглашение вызовов: аргументы освобождаются вызывающим, а возвращаемая структура вызываемым. В MinGW всё освобождается вызывающим. Первую проблему а смог починить в исходниках Clang, а вторую так и не смог найти где надо чинить. В результате работает только код, не возвращающий структуры, если вернуть структуру, то будет испорчен стек.

Я экспериментировал с 32 битами, возможно в 64 битах таких проблем нет.

Кстати в BeOS (предшественнике Haiku) одно время использовался формат PE для платформы x86, но потом перешли на ELF, видимо из-за лучшей доступности компилятора. В PE использовали Microsoft C++ ABI, но свой формат ресурсов и исключений.

Исправление X512, :

Кстати, если PE формат лучше чем ELF, то почему его не используют в linux?

Как минимум по идеологическим причинам: «это же формам винды!». Также в PE нет встроенных релокаций по произвольному адресу, но MinGW реализует свой механизм релокаций. Это сейчас не так актуально, т.к. во многих дистрибутивах используют ‘-fpic’ и импортированные символы в итоге записываются в таблицу GOT или IAT. С PE есть ещё трудность что экспортированные символы надо явно объявлять, но опять же в Линуксе с ELF уже идут по этому же пути и некоторые пакеты (например Mesa3d) собираются с -fvisibility=hidden.

Я пробовал сделать компиляцию и запуск PE модулей в Haiku и совместное использование PE и ELF. Удалось чтобы что-то работало, но столкнулся с мелкими несовместимостями ABI. Во первых MinGW почему-то передаёт this в регистре ECX, хотя используется Itanium C++ ABI. В компиляции в ELF this передаётся через стек. Во вторых в ELF для методов возвращающих структуры используется смешанное соглашение вызовов: аргументы освобождаются вызывающим, а возвращаемая структура вызываемым. В MinGW всё освобождается вызывающим. Первую проблему а смог починить в исходниках Clang, а вторую так и не смог найти где надо чинить. В результате работает только код, не возвращающий структуры, если вернуть структуру, то будет испорчен стек.

Я экспериментировал с 32 битами, возможно в 64 битах таких проблем нет.

Исправление X512, :

Кстати, если PE формат лучше чем ELF, то почему его не используют в linux?

Как минимум по идеологическим причинам: «это же формам винды!». Также в PE нет встроенных релокаций по произвольному адресу, но MinGW реализует свой механизм релокаций. Это сейчас не так актуально, т.к. во многих дистрибутивах используют ‘-fpic’ и импортированные символы в итоге записываются в таблицу GOT или IAT. С PE есть ещё трудность что экспортированные символы надо явно объявлять, но опять же в Линуксе с ELF уже идут по этому же пути и некоторые пакеты (например Mesa3d) собираются с -fvisibility=hidden.

Я пробовал сделать компиляцию и запуск PE модулей в Haiku и совместное использование DLL и ELF. Удалось чтобы что-то работало, но столкнулся с мелкими несовместимостями ABI. Во первых MinGW почему-то передаёт this в регистре ECX, хотя используется Itanium C++ ABI. В компиляции в ELF this передаётся через стек. Во вторых в ELF для методов возвращающих структуры используется смешанное соглашение вызовов: аргументы освобождаются вызывающим, а возвращаемая структура вызываемым. В MinGW всё освобождается вызывающим. Первую проблему а смог починить в исходниках Clang, а вторую так и не смог найти где надо чинить. В результате работает только код, не возвращающий структуры, если вернуть структуру, то будет испорчен стек.

Я экспериментировал с 32 битами, возможно в 64 битах таких проблем нет.

Исходная версия X512, :

Кстати, если PE формат лучше чем ELF, то почему его не используют в linux?

Как минимум по идеологическим причинам: «это же формам винды!». Также в PE нет встроенных релокаций по произвольному адресу, но MinGW реализует свой механизм релокаций. Это сейчас не так актуально, т.к. во многих дистрибутивах используют ‘-fpic’ и импортированные символы в итоге записываются в таблицу GOT или IAT. С PE есть ещё трудность что экспортированные символы надо явно объявлять, но опять же в Линуксе с ELF уже идут по этому же пути и некоторые пакеты (например Mesa3d) собираются с -fvisibility=hidden.

Я пробовал сделать компиляцию и запуск PE модулей в Haiku и совместное использование DLL и ELF. Удалось чтобы что-то работало, но столкнулся с мелкими несовместимостями ABI. Во первых MinGW почему-то передаёт this в регистре ECX, хотя используется Itanium C++ ABI. В компиляции в ELF this передаётся через стек. Во вторых в ELF для методов возвращающих структуры используется смешанное соглашение вызовов: аргументы освобождаются вызывающим, а возвращаемая структура вызываемым. В MinGW всё освобождается вызывающим. Первую проблему а смог починить в исходниках Clang, а вторую так и не смог найти где надо чинить. В результате работает только код, не возвращающий структуры, если вернуть структуру, то будет испорчен стек.