WinAVR. Використанняінструментів GNU #03. Управління компонувальником avr-ld
Деякі опції компонувальника
Хоча це не платформозалежні опції для avr-ld, перелічені стандартні опції можуть бути цікаві користувачам AVR.
Передача опцій компонувальнику із C-компілятора.
За замовчуванням всі невідомі аргументи "не опції" в командному рядку avr-gcc (тобто всі аргументи "імена файлів", які не мають суфіксів, що обробляються компілятором avr-gcc) передаються безпосередньо компонувальнику. Таким чином, усі файли, що закінчуються на .o (бібліотеки об'єктних модулів), надаються компонувальнику.
Системні бібліотеки зазвичай не передаються їх явними іменами, краще використовувати опцію -l, яка використовує скорочену форму імені архіву (дивіться сторінку 1 цього розділу). avr-libc додає дві системні бібліотеки, libc.a та libm.a. Хоча стандартна бібліотека libc.a завжди шукатиметься для невизначених посилань, коли запускається компонувальник, використовуючи препроцесор компілятора Сі (тобто завжди є принаймні одна неявна опція -lc), математична бібліотека libm.a потребує явного запиту, використовуючи -lm. Також дивіться цей розділ FAQ.
Умовно makefile'и використовують макрос збірки LDLIBS , щоб стежити за опціями -l (і можливо -L), які повинні бути додані в командний рядок компілятора Сі тільки при компонуванні кінцевого двійкового коду. А макрос LDFLAGS використовується, щоб записати інші опції командного рядка Сі компілятора, які мають бути передані як опції під час етапу компонування. Відмінність цих опцій, розміщених раніше у командному рядку, у цьому, що бібліотеки входять у її кінці, оскільки вони мають бути використані, щоб визначити глобальні символи досі ще невизначені нині.
Спеціальні прапори компонувальника можуть бути передані зкомандного рядка Сі компілятора, використовуючи опцію компілятора -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 може бути змінено в командному рядку компонувальника. Оскільки компонувальник зазвичай викликається з препроцесора компілятора, цього можна досягти, використовуючи опцію компілятора, подібну до наступної:
Переклад розділуUsing the GNU tools зAVR Libc v.1.6.6