klen (04.02.2020 10:03 - 10:17, просмотров: 413) ответил evgeniy1294 на Я не до конца был уверен в причине, тем более я не знал, с какими флагами собраны библиотеки. Дока на gcc местами довольно специфичная, источник проблемы можно искать неделями.
я должен был сообщить с какикими флагами собпан пакет чтобы небыло проблем с линковкой или сделать мультилиб чтобы были все комбинации. существуют следующие факты: 1) натурально при втыкании например различных вариаций родственных -march, например -march=rv32e и -march=rv32imac будут генерится код соответствующий каждой из этих архитектур, в первом случае код будет использовать в двое меньшее количество регистров прцессора, в объектниках ставятся флаги в полях служебной информации об этих тонкостях. линкер проверяет соответствие объкктников и всех либ которые ему на ликовку всунули. если он видит несовместимый набор инструкций или набор регистров то выдает сообщение как нашем примере. таким образом исключается зоопарк с линковкой кода объектников для несовместимых процессоров.
2) стандартная прцедура (в gcc естественно возможны изощренные извращения по явному указанию) линковки собирает в кучку а) объектники прилагухи где обычно есть main(), б) пользовательские библиотеки явно указанные пользователем ключем -l ц)неявно добавляймые ( что тоже гибко можнь регулировать) библиотека содержащая програмные реализации операций над базовыми типами данных libgcc и библиотека стандартных функций libc. libgcc это часть gcc и собирается при сборке компилятора. в ней учитывается из ходя из ключей архитетупы проца что туда всовывать, к примеру есл у указанного проца есть инструкции над плавающей запятой то в ней не будет фукций програной реализации над этим типом данных, в свою очередь компилятор в этом случае будет генерить код с аппаратными иструкциями и линковать этот вариант libgcc. с другой стороны libc это внешняя либа и к gcc формально не относится. но есть договор что варианты libc должна лежать в правильном месте в дереве каталогов компилятора
3)есть понятие мультилиб. это соответствие набора ключей компиляции и набора libgcc libc libm, они должеы быть собраны с этими ключами и лежать согласно вышеупосянутому договору. компилятор тупо компиляет исходники в объектники и при линковке исходя из ключей передает линкеру инфу где брать на линковку соответствующий ключам набор libgcc libc libm, есл вдруг оказалось что такого каталога нет или там нет файлов библиотек то выполняется попытка сликоватся с "корнем мультилиба", жто что то похожее на дефолтный вариант, в случае наприме если это компилятор для arm то обычно это оибы для самого примитивного armv4, соответственно если проц arm7tdmi то всп прканает и будет работать, но если кортекс то неслинкуется ибо разный набор команд.
4)в данной сборке я указал что она конкретно для gd32vf103 то есть для проца rv32imac , все соответствующие ключи прибиты гвоздями при конфигурвции компиллера и формально их можно вообще не указывать, он их сам вставит, есии вы их указываете явно то указанеые в командной строке имеют приоритет. такой вариант удобен потому что в данном случае мультилиб состоит из одного единственного варианта и можно его при конфигурации зафиксировать.
по мойму не все так сложно, а главное есть все педали и рычажки управленмя и они работают!
разумеется конечный программисть не обязан об этом знать, задача сборщика собрать пакет чтоб работал изкаропки, но если конечный программист не хочет быть конченым то всетаки нужно знать поболее чем хелоуворд. жотя бы этого хотеть :)
извиняюсь орфографию, палец больше клавиатуры на телефоне.