как связать crtbegin.o и crtend.o с моей 32-разрядной ОС с помощью clang

#linker #operating-system #crt

Вопрос:

В последнее время я возился с созданием ОС x86 и решил преобразовать ее из кросс-компилятора GCC в использование clang . В частности, я использовал файл Makefile clang -target i386-pc-none и -m32 . После некоторой борьбы мне, наконец, удалось пройти стадию компиляции и перейти на стадию компоновки, однако я получаю эту ошибку:

 /usr/bin/ld: i386:x86-64 architecture of input file `arch/i386/crtbegin.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `arch/i386/crtend.o' is incompatible with i386 output
 

Обратите внимание, что оба этих файла на самом деле не существуют в моей операционной системе и просто помещаются туда в какой-то момент в процессе сборки компилятором (я специально говорю ему сделать это в файле Makefile). Однако, несмотря на то, что у меня есть -m32 и -target флаги, а также установлена 32-разрядная libc (хотя моя ОС 64-разрядная), она не пытается связать 32-разрядные версии. Как я могу это исправить?

Следует ли вообще использовать систему crtbegin и crtend? Уже очень поздно, я совсем не могу думать.

Вся помощь ценится, и я могу предоставить дополнительную информацию вместе с источником, если это необходимо, спасибо!

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

1. Я не понимаю вопроса. Почему вы пытаетесь установить связь с crt? Если вы создаете ОС, вам не нужно связываться с crt.

2. На самом деле вы могли бы просто сказать компоновщику, какова ваша точка входа. Я не знаю, как насчет лязга. С помощью ld просто укажите точку входа с -entry main помощью . Это подскажет ld сделать точку входа исполняемого файла main функцией.

3. @user123 ОС в какой-то момент переходит к коду на языке Си. Моя проблема сейчас в том, что с i686-elf-gcc он использовал для создания некоторых совместимых файлов crtbegin и crtend, которые отлично работали с ним, но теперь clang они несовместимы, и я не знаю, почему. Я бы предположил, что, возможно, что-то не так с целевой архитектурой, но я считаю i386-pc-none , что это правильно. Но, возможно, он пытается создать 64-разрядную элт, несмотря -m32 на это . Я действительно не знаю, что происходит и почему простое изменение компилятора сломало так много вещей.

4. @user123 Взглянув на него немного подробнее, действительно кажется, что он пытается получить 64-разрядный crtbegin и crtend, в то время как i686-elf-gcc имеет правильные 32-разрядные версии

5. Честно говоря, я мало что знаю о времени выполнения c и тому подобном. Я думал, что в автономной реализации ничего этого нет. Разве crtbegin и crtend не используются для вызова конструкторов и деструкторов объектов. В автономной и статичной операционной системе в этом нет необходимости. Что тут можно построить и разрушить? Вы передали -nostdlibs флаг лязгу и -ffreestanding флагу?