Как я могу заставить GCC генерировать объектные файлы ELF? - PullRequest
0 голосов
/ 09 сентября 2018

Мне нужно использовать компилятор TCC для связи объектных файлов, сгенерированных GCC. Однако GCC в MinGW выводит объектные файлы в формате COFF, а TCC поддерживает только формат ELF. Как я могу заставить GCC генерировать объектные файлы ELF?

$ cat test.c
int main(void)
{
        return 0;
}
$ gcc -c test.c
$ file test.o
test.o: MS Windows COFF Intel 80386 object file
$ tcc -c test.c
$ file test.o
test.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Однако GCC в MinGW выводит объектные файлы в формате COFF

GCC может быть настроен для генерации различных выходов (включая ELF) независимо от того, на каком хосте он работает.

То есть GCC, работающий в Linux, может быть настроен на генерацию COFF, а GCC, работающий в Windows, может быть настроен на генерацию ELF32 или ELF64 для различных процессоров (например, x86 или *). 1016 * или MIPS).

Компилятор, который работает на одном типе хоста, но генерирует код для другого вида, называется кросс-компилятором.

TCC поддерживает только формат ELF

Это не имеет смысла утверждение: это может означать, что вы хотите, чтобы GCC генерировал ELF32 for i686 Linux, или ELF64 for SPARC Solaris, или любое количество других комбинаций процессор / ОС / бит.

Вы должны выяснить, на каком целевом процессоре и операционной системе вы хотите запустить свой финальный исполняемый файл, а затем собрать (нетривиально) или загрузить соответствующий кросс-компилятор из Windows для этой цели.

file test.o
test.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

Хорошо, вы хотите, чтобы в Windows был Linux/i386/ELF32 кросс-компилятор.

0 голосов
/ 11 сентября 2018

Вы хотите, чтобы ваш компилятор (MinGW) генерировал двоичные файлы, не относящиеся к типу, используемому для вашей хост-системы (Windows). Это называется кросс-компиляция , и это несколько сложная тема - потому что для создания полных исполняемых файлов вам также потребуются различные библиотеки: стандартные библиотеки, библиотеки целевой ОС, третье- партийные библиотеки ... так что это не просто вопрос «как заставить компилятор создавать ELF», а также «как получить весь вспомогательный набор библиотек ELF, чтобы я мог ссылаться на них?».

OSDev имеет достаточно обширную документацию по настройке кросс-компилятора; однако, поскольку вы не сообщили нам, в чем именно состоит ваша проблема , вам будет сложно дать вам дальнейшие рекомендации.

Если то, что вы хотите, генерирует Linux бинарные файлы, то я бы посоветовал не беспокоиться о кросс-компиляции (которая является сложной задачей - и гораздо лучше поддерживается с другой стороны около, то есть для Windows из Linux ), но лучше установить дистрибутив Linux параллельно с Windows, и работать с ним изначально.

0 голосов
/ 10 сентября 2018

strip может помочь. strip принимает различные форматы объектных файлов для типа ввода и вывода (имя bfdname). strip --info для поддерживаемых форматов.

strip -o outputname -O elf32-i386 objfile Выполнение этого на 64-битном исполняемом файле, преобразованном в 32-битные контрольные заголовки, приведет только к сбою, поэтому тщательно выбирайте форму вывода. Убедитесь, что вы не меняете предполагаемую пропускную способность / порядковый номер вместе с заголовками.

Не работает MinGW, поэтому не проверено , может не работать для ваших нужд или, что еще хуже, может прыгнуть и загореться.

...