#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
флагу?