все свежаки которые я собираю - собираются из транка, если всплывают косяки я их по возможности правлю чтоб собралось, потом тестирую в силу возможности и тоже правлю если опятже косяки в кодогенерации. То есть по сути - сборки экспериментальные и могут работать с ошибками. Но сегодня сборка экспеерментальная в квадрате. я потратил время на то чтоб разобратся с LTO + Gold.
LTO - оптимизация времени линкования. те кто еще не интересовался что это такое то можно почитать тут (коротко на русском)
http://kemiisto.blogspot.com/2010/08/gcc-4...timization.html и тут
http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gc...ptimize-OptionsGOLD (gnu ld.gold) - это новый эксперементальный линкер который возможно заменит классический LD (gnu ld.bfd). штатно входит в binutils. Google и многие проекты - LLVM, GNU итд, его используют тестируют и девелопят как основной. основным локомотивом его разработкии внедрения является google. в маках кажется тоже он штатно используется.
не для кого не секрет что в больших проектах (не таких как у нас - эмбедеров) основное время сборки занимает линковка. поскольку Gold был задуман как линкер больших проектов, его рамках сразу делали LTO. до сегодняшнего дня у меня LTO не работало - я тестировал на сложном проекте, использовал обчный LD, проект состоял и з можества собранных либ и тд. пришло время.....
итак. сегодняшняя сборка по умолчанию использует в качестве линкера Gold. все библиотеки GCC и newlib собраны c опцией -flto. проект собирался тоже с -flto. речь будет идти про arm таргет.
код генерится рабочий. но есть нюансы...
1. при линковке нада передавать также и флаги оптимизации ! если не передать то линковка падает. ( ув. тов. АНТОХА это обнаружил раньше меня ). я думаю это ошибка в компиллере - эти флаги и так можно хранить в секциях объектника да еще они могут быть разными у разных объектиков
2. LTO - это реально ЖЕСТЬ!!!!!. после первой сборки я обнаружил что проект уменьшился в два раза.... начал ковырять. оказалось оптимайзер нафег выкинул таблицу векторов прерываний! выкинул функции - обработчики прерываний и тд много чего.
я сначала ошалел - а потом попробывал представить сябя на его месте. и действительно - таблица векторов это тупо массив байтов. он же не знает что это такое. к этому массиву из кода не происходит никаких обращений - значить это мертвое - отрезаем...
обработчики исключений - таже истоия - они "апаратно" вызываются.. и так далее и тому подобное.
для того чтоб вернут взад вектора я сделал в crt коде одно фиктивное обращение к таблице на чтение содержимого - и Gold впечатленный этим оставил структуру в котой у менф оформлена таблица векторов в покое - она появилась в бинарнике с нужного адреса. далее некоторым функция пришлось воткнуть атрибут
externally_visible чтоб он их не выкидывал.
3. есть шаманство с вызовом main из crt кода, с другими функциями я не заметил такого. както очень хитро это происходит. надо разбираться.
4. если функция вызывается из асемблерной вставки - то ни комиллер ни голд это отследить не может и выкидывает ее как ненужную, далее получаем неразрешенную ссыку на конечном этапе линкования. в этом случае надо помечать такую функцию атрибутом
externally_visible примером такой функции может служить void xPortPendSVHandler( void ) из FreeRTOS
5. линкер выдает мессагу которую я пока не понял юмора :
Цитата
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/bin/ld: warning: creating a segment to contain the file and program headers outside of any MEMORY region
6. РЕЗУЛЬТАТЫ
сборка от 19 числа стандартный линкер ld.bfd
без LTO
Код
memutz .././../out/image.elf 512K 64K
section info:
sec name size increase[%]
.text 18728 0 (0.000000%)
.data 260 0 (0.000000%)
.bss 33256 0 (0.000000%)
utilization:
ram : 51.1414% 0 (0.000000%)
flash: 3.62167% 0 (0.000000%)
c LTO
Код
section info:
sec name size increase[%]
.text 15816 -2912 (-15.548909%)
.data 202 -58 (-22.307694%)
.bss 33245 -11 (-0.033075%)
utilization:
ram : 51.0361% -69 (-0.205874%)
flash: 3.05519% -2970 (-15.641457%)
бинарь не работает - изгажен crt. видимо както можно заставить но у меня не получилось, явно видно что выкинул и то что нужно! как он смог слинковать после этого!?? нада дифы листингов курить...
сегодняшняя сборка с Gold без LTO
Код
section info:
sec name size increase[%]
.text 18768 0 (0.000000%)
.data 260 0 (0.000000%)
.bss 33256 0 (0.000000%)
utilization:
ram : 51.1414% 0 (0.000000%)
flash: 3.6293% 0 (0.000000%)
сегодняшняя сборка с Gold c LTO
Код
section info:
sec name size increase[%]
.text 15992 -2776 (-14.791131%)
.data 528 268 (103.076935%)
.bss 35201 1945 (5.848575%)
utilization:
ram : 54.5181% 2213 (6.602812%)
flash: 3.15094% -2508 (-13.180578%)
РАБОТАЕТ!!!!! НО..... что он делает с кодом

! я в листингах ваще концы найти не могу. отладчик уходит в астрал и в состоянии только остановить и пустить код далее - ничего более, даже адреса глобальных переменных определить не может. глядя асм видно что функций уже видимо нет! все нахрен так перемешано что там где ранее были переходы из дной функции в другу - их там просто нет - линейный код! полный ахтунг.
но подчеркиваю - оно както работает. что честно говоря изумляет. у меня сложный проект на С++ с испоьзование вычисленй на плавучке и FreeRTOS - гденибудь да вылез бы косяк, однакож честно все считается и работает.
6, видно что зачемто LTO увеличивает расход ОЗУ, что это косяг или так вынуждено - пока не исследовал. нада файлы мапы памяти смотреть и разбиратся. пожже.
7. есть недостаток но для нас эмбеддеров не существенный - преред линковкой все объектиники загоняются в память и ликер по ним ходит и отимизирует. соответственно слинковать проект объем объектников которо больше чем ОЗУ хост машины - нельзя, правдв идет работа у разработчиков чтоб это кусками можно былобы делать.
8. довольно долго GDB учили понимать отоптимайщеный код - научили. затем очень доло его учили понимать код сгенеренный компиллером C++ (шаблончики, виртуальные методы и конструкторы в сошках и прочая...) типа щас более менее но не всегда цепляестя за код. С LTO видимо будет полная попа - на выходе настолько не то "что вы имели ввиду" что похоже отладчикам ничего не светит даже в отдаленной перспективе. хотя кто знает.... про дебаг неоптимизированного кода я не говорю - считаю актом практически не несущим новой информации в эмбедед.
9. в итоге видим что LTO вещ чумовая и сравнительно новая, неустоявшаяся. но на мой взгляд это реальный идейный прорыв в методах оптимизации. на данный момент все в стадии отработки и вопросов пока больше чем ответов.
все это можно поробывать в действии - сборка для хоста linux 64bit
http://klen.org/Files/DevTools/linux-x86_6...ld-lto.tar.lzma