Viciouspriest 0 15 декабря, 2016 Опубликовано 15 декабря, 2016 · Жалоба Всем здравствуйте. Осваиваю ланчпадавский компилятор. Столкнулся с тем, что при включенной Lto не видит функции, например sqrt(), из math.h. "undefined reference to `sqrt' collect2.exe: error: ld returned 1 exit status". Compile opts -mcpu=cortex-m3 -flto -lto -mthumb -fpack-struct -Wpadded -g -Os Linker opts -mcpu=cortex-m3 -flto -mthumb -Wl,--gc-sections,-Map=Project.elf.map,-cref,-u,Reset_Handler Target CPU STM32F103RET6 gcc-arm-none-eabi-5_4-2016q3-20160926-win32 Подозреваю, что дело в ключах, но не знаю в каких. Очень надеюсь на ответ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 15 декабря, 2016 Опубликовано 15 декабря, 2016 · Жалоба Вроде бы ещё надо линкеру передать ключ оптимизации (-Os) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Viciouspriest 0 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба Вроде бы ещё надо линкеру передать ключ оптимизации (-Os) Не, дело было не в этом. Вчера наконец-то разобрался. Почему-то -Lto выкидывает библиотеку m. Я прописывал -lm, но это не помогало потому, что lm надо прописывать в самом конце, после перечисления всех о-файлов, а я писал вначале. Почему это происходит - непонятно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба А, ну это известная штука. Понять этого нельзя, поэтому надо запомнить:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба Я прописывал -lm, но это не помогало потому, что lm надо прописывать в самом конце, после перечисления всех о-файловРазумеется. По умолчанию включено --as-needed. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 21 декабря, 2016 Опубликовано 21 декабря, 2016 · Жалоба Прочитал доку про --as-needed и для меня не совсем очевидно описанное ТС поведение (откидывание libm). Я понял, что линкер должен выкинуть лишь те либы на которые нет ссылок. Поясните пожалуйста, если не трудно, что я не так понимаю. Понял кажется! Если либа включена до объектиников, то на момент её линковки на неё просто ещё нет ссылок. Линкер видимо по умолчанию однопроходный. Кстати, для решения сложных циклических завязок либа от либы есть ключики --start-group --end-group -Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 23 декабря, 2016 Опубликовано 23 декабря, 2016 · Жалоба да, злостная шутка с этими линкер-опциями и порядком подключения библиотек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 23 декабря, 2016 Опубликовано 23 декабря, 2016 · Жалоба да, злостная шутка с этими линкер-опциями и порядком подключения библиотек. Это избавляет от излиших связей. Если бибилиотека по факту не используется, то линковаться с ней не надо, несмотря на то, что она почему-то указана в списке на линковку. Так что какие уж шутки. См. https://www.altlinux.org/UpStream/AsNeeded Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 32 25 декабря, 2016 Опубликовано 25 декабря, 2016 · Жалоба Это избавляет от излиших связей. Если бибилиотека по факту не используется, то линковаться с ней не надо, несмотря на то, что она почему-то указана в списке на линковку. Всего этого можно достичь (и полно линкеров, которые это умеют.., да, по ходу, все кроме гнутого умеют) и без этой дурацкой фичи: либо сделать обработку двухпроходной, либо разрешение связей не делать непосредственно в процессе чтения данных - например, сперва все данные читаются, потом, когда вся оперативная информация в наличие, производится разрешение связей. Гнушный линкер просто 1) однопроходный, 2) производит обработку связей непосредственно во время чтения файлов, т.е. если библиотека указана раньше объектного файла, из которого есть ссылка на библиотечный объект, то из библиотеки ничего не линкуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 25 декабря, 2016 Опубликовано 25 декабря, 2016 · Жалоба Всего этого можно достичь (и полно линкеров, которые это умеют.., да, по ходу, все кроме гнутого умеют)А ничего, что тут весь тулчейн GNU? Вы предлагаете заменить GNU ld на какой-то другой? И всякие configure.ac и Makefile.am патчить тоже предлагаете? Ну круто, чо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 32 26 декабря, 2016 Опубликовано 26 декабря, 2016 · Жалоба А ничего, что тут весь тулчейн GNU? Вы предлагаете заменить GNU ld на какой-то другой? И всякие configure.ac и Makefile.am патчить тоже предлагаете? Ну круто, чо. Где вы увидели предложение что-то менять? Я сказал лишь то, что есть и другие способы реализовать выкидывание ненужных объектов, свободные от зависимостей, возникающих от порядка указания библиотек. Кстати, даже если представить, что ld вдруг исправят и его поведение в части подключения библиотек не будет зависеть от порядка их указания, это ничего не сломает и ничего править не придётся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 26 декабря, 2016 Опубликовано 26 декабря, 2016 · Жалоба Я сказал лишь то, что есть и другие способы реализовать выкидывание ненужных объектов, свободные от зависимостей, возникающих от порядка указания библиотек. Кстати, даже если представить, что ld вдруг исправят и его поведение в части подключения библиотек не будет зависеть от порядка их указания, это ничего не сломает и ничего править не придётся. Во-первых, уже ничего исправлять не будут. Такое поведение есть уже исправленное. Во-вторых, старое поведение по-прежнему доступно при указании --no-as-needed. Но оно ненужно. Все апстримы уже давно исправились. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 26 декабря, 2016 Опубликовано 26 декабря, 2016 · Жалоба Андрей, вы б послушали, что dxp говорит... Выкидывать неиспользуемые библиотеки - это хорошо, и с этим никто не спорит. Однако сам механизм определения "неиспользуемости" в ld сделан неидеально (даже ваша ссылка на шаманские действия с альтлинуксом это подтверждает). Конкурирующие организации почему-то сделали этот механизм лучше (никогда не задумывался, как - там оно просто РАБОТАЛО). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 26 декабря, 2016 Опубликовано 26 декабря, 2016 · Жалоба Однако сам механизм определения "неиспользуемости" в ld сделан неидеально Конкурирующие организации почему-то сделали этот механизм лучше (никогда не задумывался, как - там оно просто РАБОТАЛО). Ещё раз. У нас есть тулчейн имени GNU. Линкер там работает так, как работает. Да существеут куча других тулчейнов, в которых линкеры рабоают по-другому. Но причём тут они, зачем о них тут писать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 26 декабря, 2016 Опубликовано 26 декабря, 2016 · Жалоба Ответов по делу тут два: #6 от demiurg_spb (что делать и где читать) и #9 от dxp (с объяснением, что там "внутри"). Спасибо за оба, кстати: раньше я просто менял местами инклюды. И какой-то флуд на тему "у меня всё работает, проблемы на вашей стороне" (не буду пальцем показывать). Слава богу, gcc - это не нечто, отлитое в граните в полночь 1.01.1970, и он худо-бедно развивается. Будем надеяться, и здесь допилят тоже... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться