Связывание с Clang и слабыми символами
Я хотел бы выполнить кросс-компиляцию с целью ARM Cortex-M4 с Clang10 и использовать GCC10 (arm-none-eabi-gcc) для предоставления библиотек и заголовков. К сожалению, процесс связывания вызывает у меня головную боль. Кажется, есть проблема со слабыми определениями, экспортированными из libc_nano и libstdC++_nano. Я не могу перезаписать __assert_func или __cxa_pure_virtual, оба из которых должны (насколько мне известно) содержать слабые определения в libc_nano соответственно libstdC++_nano.
Я уже запускал оба компилятора с включенной подробной информацией для анализа вывода во время компоновки, но я не совсем уверен, что с этим делать. Единственное существенное различие, которое я заметил, это то, что GCC, кажется, сначала связывает мои библиотеки проектов, а потом свои собственные (так, например, ссылку libmylib.a перед libstdC++_nano). Также есть какое-то странное повторение двух групп, которое для меня не имеет смысла? Я всегда думал, что пара флагов "start-group -> end-group" должна разрешать за вас любые зависимости?
Вот вывод GCC
/usr/lib/gcc/arm-none-eabi/10.1.0/collect2
-plugin /usr/lib/gcc/arm-none-eabi/10.1.0/liblto_plugin.so
-plugin-opt=/usr/lib/gcc/arm-none-eabi/10.1.0/lto-wrapper
-plugin-opt=-fresolution=/tmp/ccea5cKc.res
-plugin-opt=-pass-through=-lgcc
-plugin-opt=-pass-through=-lg_nano
-plugin-opt=-pass-through=-lc_nano
-plugin-opt=-pass-through=-lgcc
-plugin-opt=-pass-through=-lc_nano
--sysroot=/usr/arm-none-eabi
-EL -X -o myelf
-L/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard
-L/usr/lib/gcc/arm-none-eabi/10.1.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard
-L/usr/arm-none-eabi/lib/thumb/v7e-m+fp/hard -L/usr/lib/gcc/arm-none-eabi/10.1.0
-L/usr/lib/gcc/arm-none-eabi/10.1.0/../../../../arm-none-eabi/lib
-L/usr/arm-none-eabi/lib
--gc-sections
my.obj
libmylib.a
-lstdc++_nano -lm
--start-group -lgcc -lg_nano -lc_nano --end-group
--start-group -lgcc -lc_nano --end-group
-T ldscript.ld
И вот вывод Clang
"/usr/bin/ld.lld"
--gc-sections
/usr/arm-none-eabi/lib/crt0.o
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crti.o
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtbegin.o
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtn.o
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtend.o
--start-group -lstdc++_nano -lm -lgcc -lc_nano --end-group
my.obj
libmylib.a
-Bstatic
-L/usr/lib/clang/10.0.0/lib/baremetal
-L/usr/arm-none-eabi/lib/thumb/v7e-m+fp/hard/
-L/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/
-T ldscript.ld
-o myelf