Как да направя кръстосан компилатор с помощта на gcc?

Въпреки че има много уроци онлайн за това как да направите кръстосан компилатор, всъщност не го разбирам.

Използвам fedora 16 и вече имам инсталиран gcc. Не съм сигурен за binutils. Как да направя кръстосан компилатор за моята собствена операционна система (целта)? Четох тук в os dev wiki, но не го разбирам. Искам да кажа, какво да правя? Просто не следвам стъпките там.

Забележка: Искам да създам крос компилатор за същата архитектура, върху която работя в момента. Имам предвид същата архитектура, която изпълнява Fedora.


person Suhail Gupta    schedule 16.07.2013    source източник
comment
Това е добро ръководство за изграждане на помощните програми (binutils, newlib) и gcc. sourceware.org/ml/crossgcc/2005-08/ msg00114/l-cross-ltr.pdf   -  person Oscar Castiblanco    schedule 16.07.2013
comment
Това ще зависи от това как изглежда вашата собствена операционна система. Ако това е домашна операционна система за същата архитектура като вашата Fedora, тогава това е най-лесната ситуация: можете да разрешите с персонализиран скрипт за свързване.   -  person rodrigo    schedule 16.07.2013
comment
Използването на gcc задължително ли е за вас? Ако не, тогава можете да опитате llvm-clang. Много по-лесно е да научите llvm-clang, защото е проектиран да бъде такъв. Потърсете „Урок: Изграждане на бекенд за 24 часа – урок стъпка по стъпка за изграждане на бекенд“. в llvm.org/devmtg/2009-10   -  person A. K.    schedule 16.07.2013


Отговори (1)


Ако архитектурата на вашата собствена ОС е същата като тази на работещата ви ОС, тогава не се нуждаете от нов компилатор, същото, което вече имате, ще свърши работа. Все пак може да имате нужда от персонализиран binutils, но това зависи от формата на изпълнимите файлове, от които вашата собствена ОС се нуждае.

Това, което направих за моята собствена операционна система играчка, е да я накарам да разбира двоичните файлове на ELF: това е абсурдно лесен формат за зареждане и стартиране. И по този начин можете да използвате стандартния binutils на вашата ОС. Просто трябва да свържете вашите изпълними файлове с персонализиран скрипт за свързване, а не да се свържете с която и да е библиотека на Linux.

Но имайте предвид, че много хора считайте това за не толкова добра идея, но може да ви задържи известно време.

Моята команда за компилатор изглежда така:

%.o: %.c
        gcc -c -o $@ -ffreestanding -fno-stack-protector -mpreferred-stack-boundary=2 -Os -g -Wall $<

И моята команда за свързване:

%.myexe: %.o
        ld -o $@ -T myexe.ld $^ `gcc -print-libgcc-file-name`

За справка, скриптът за свързване е myexe.ld:

ENTRY(main)

SECTIONS
{
    .text :
    {
        *(.text)
    }
    .data :
    {
        *(.data)
    }
    .rodata :
    {
        *(.rodata)
    }
    .bss :
    {
        *(.bss)
    }
}
person rodrigo    schedule 16.07.2013
comment
Не знам за . и *, които сте използвали в скрипта за свързване. Това някакъв език ли е? Не знам нищо за това - person Suhail Gupta; 17.07.2013
comment
@SuhailGupta: Можете да прочетете info ld за подробности. По принцип секцията SECTIONS се използва за определяне на оформлението на крайния изпълним файл. Например, крайната ELF секция с име .text (.text : { ... }) ще бъде съставена от конкатенациите на .text секции ((.text)) от всеки обектен файл (*). Има и нещо повече, разбира се, това са само основите. Допълнителните битове зависят много от характеристиките на вашата операционна система. - person rodrigo; 17.07.2013