winavr. ИзползванеGNU инструменти #03. avr-ld линкер контрол

Някои опции за свързване

Въпреки че това не са специфични за платформата опции за avr-ld, изброените стандартни опции може да представляват интерес за потребителите на AVR.

Предаване на опции към линкера от C компилатора.

По подразбиране всички неизвестни аргументи "без опция" на командния ред avr-gcc (т.е. всички аргументи "име на файл", които нямат суфикси, обработени от компилатора на avr-gcc) се предават директно на линкера. По този начин всички файлове, завършващи на .o (библиотеки на обектни модули), се предоставят на линкера.

Системните библиотеки обикновено не получават своите изрични имена, по-добре е да използвате опцията -l, която използва съкратената форма на името на архива (вижте страница 1 от този раздел). avr-libc добавя две системни библиотеки, libc.a и libm.a. Въпреки че стандартната библиотека libc.a винаги ще се търси за недефинирани препратки, когато линкерът се стартира с помощта на предпроцесора на C компилатора (т.е. винаги има поне една имплицитна опция -lc), математическата библиотека libm.a трябва да бъде изрично заявена с помощта на -lm. Вижте също раздела с ЧЗВ, обясняващ това.

Обикновено make-файловете използват макроса за изграждане LDLIBS, за да следят опциите -l (и евентуално -L), които трябва да се добавят към командния ред на C компилатора само при свързване на крайния двоичен файл. А макросът LDFLAGS се използва за записване на други опции на командния ред на C компилатора, които трябва да бъдат предадени като опции по време на стъпката на свързване. Разликата с тези опции, поставени по-рано в командния ред, е, че библиотеките са включени в края на командния ред, тъй като те трябва да се използват за дефиниране на глобални символи, които все още са недефинирани в момента.

Могат да се предават специални флагове за свързванекомандния ред на C компилатора, използвайки опцията на компилатора -Wl (вижте страница 1 от раздела). Тази опция не изисква интервали в добавените опции за свързване, въпреки че някои от горните опции за свързване (като -Map или --defsym) изискват интервали. В тези ситуации интервалът може да бъде заменен с еквивалентен знак. Например, следният команден ред може да се използва за компилиране на foo.c в изпълним файл и извеждане на карта на оформлението, която съдържа списък с кръстосани препратки към foo.map:

$ avr-gcc -O -o foo.out -Wl,-Map=foo.map -Wl,--cref foo.c

$ avr-gcc -mmcu=atmega128 -o foo.out -Wl,-Tdata,0x802000

Вижте описанието на секцията с данни за обяснение защо 0x800000 трябва да се добави към реалната стойност. Обърнете внимание, че стекът все още остава във вътрешната RAM, започвайки от символа __stack, който се предоставя от изпълнимия код за инициализация. Това вероятно е добра идея (защото достъпът до вътрешната RAM е по-бърз) и дори е необходимо за някои ранни контролери, които са имали хардуерни грешки, които им пречат да използват стека във външна RAM. Имайте предвид, че купчината за malloc() все още може да бъде разпределена след всички променливи в секцията с данни без конфликти между стека и купчината.

Обикновено, за да преместите стека от местоположението му по подразбиране в горната част на вътрешната RAM, стойността на символа __stack може да бъде променена в командния ред на линкера. Тъй като линкерът обикновено се извиква от препроцесора на компилатора, това може да се постигне с помощта на опция на компилатор като следната:

Превод на разделИзползване на инструментите на GNU отAVR Libc v.1.6.6