У меня есть проект GCC для микроконтроллера. Есть некоторые функции в время выполнения, которые должны быть заменены, чтобы адаптировать окружающую среду:Ссылка на конкретную библиотеку
_write_r
_sbreak_r
Я выполнил функции в файл sys.c. Когда я связываю файл sys.o с моим проектом, он работает так, как ожидалось. Но когда я добавил sys.o в библиотеку bsp.a и связал библиотеку с моим проектом, реализация libc.a имеет приоритет, и моя замена больше не работает.
Как я могу связать линкер с тем, что он сначала связывает мою библиотеку, прежде чем принимать определения из libc? Я бы предпочел решение, в котором скрипт компоновщика управляет этим приоритетом.
Редактировать: GCC вызывается средой разработки для этапа связывания. Он управляет вызовом ld
, а параметры командной строки ld
не могут контролироваться напрямую.
Редактировать: Центральный процессор Cotex-M3 NXP LPC1788.
Когда я запускаю ССАГПЗ, связывающую команду с опцией -v я получаю эту информацию:
c:/arm/bin/../lib/gcc/arm-none-eabi/4.7.4/collect2.exe
--sysroot=arm\bin\../arm-none-eabi
-X
-o bin/test.elf
-n arm/bin/../lib/gcc/arm-none-eabi/4.7.4/armv7-m/crti.o arm/bin/../lib/gcc/arm-none-eabi/4.7.4/armv7-m/crtbegin.o arm/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/armv7-m/crt0.o
-LD:/mylibs
-LC:\arm\lib
-Lc:/arm/bin/../lib/gcc/arm-none-eabi/4.7.4/armv7-m
-Lc:/arm/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/armv7-m
-Lc:/arm/bin/../arm-none-eabi/lib/armv7-m
-Lc:/arm/bin/../lib/gcc/arm-none-eabi/4.7.4
-Lc:/arm/bin/../lib/gcc
-Lc:/arm/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib
-Lc:/arm/bin/../arm-none-eabi/lib @C:\Users\harper\AppData\Local\Temp\cc9FN35g
--start-group -lgcc -lc --end-group
c:/arm/bin/../lib/gcc/arm-none-eabi/4.7.4/armv7-m/crtend.o
c:/arm/bin/../lib/gcc/arm-none-eabi/4.7.4/armv7-m/crtn.o
-T src\LPC1788_Flash.ld
Очевидно, есть --start-group -gcc -lc --end-group
collect2.exe
аргумент. Но еще не удалось добавить мою библиотеку.
Файл LPC1788_Flash.ld имеет это содержание:
ENTRY(Reset_Handler)
MEMORY {
FLASH (rx) : ORIGIN = 0, LENGTH = 512K
RAM (xrw) : ORIGON = 0x10000000, LENGTH = 64K
}
SECTIONS {
// a lot of input and output sections, like ...
.isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) } >FLASH
.data : { ... } >RAM
.bss : { ... } >RAM
/DISCARD/ : {
libc.a (*)
libm.a (*)
libgcc.a (*)
}
}
Это не должно быть сложнее, чем вставлять им правильный порядок в вызове компоновщика. http://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking/ – auselen
@auselen Это предположение верно только в том случае, если вы рассматриваете библиотеки пользователей или вы вызываете компоновщик вручную. (см. мое редактирование). – harper
Это что-то не может быть разрешено опцией gcc «-Wl»? Этот переключатель передает параметры компоновщику. – auselen