ARM静态库链接与gcc ld和armlink不同

ARM静态库链接与gcc ld和armlink不同,gcc,garbage-collection,arm,static-libraries,keil,Gcc,Garbage Collection,Arm,Static Libraries,Keil,我使用arm none eabi gcc构建了一个静态库,并使用-fdata节、-ffunction节和--gc节来减少库内存占用 在使用arm none eabi gcc构建应用程序示例时,我已经成功地在应用程序示例中使用了该库,但是当我尝试使用armcc(Keil)构建相同的应用程序时,我在静态库中得到了大量未定义的符号 当我删除--gc部分并使用arg none eabi gcc构建时,我可以看到与Keil上相同的未定义符号,我假设--gc部分去掉了它们。但是如果我向Keil添加--spl

我使用arm none eabi gcc构建了一个静态库,并使用-fdata节、-ffunction节和--gc节来减少库内存占用

在使用arm none eabi gcc构建应用程序示例时,我已经成功地在应用程序示例中使用了该库,但是当我尝试使用armcc(Keil)构建相同的应用程序时,我在静态库中得到了大量未定义的符号

当我删除--gc部分并使用arg none eabi gcc构建时,我可以看到与Keil上相同的未定义符号,我假设--gc部分去掉了它们。但是如果我向Keil添加--split_部分和--remove选项,Keil仍然在抱怨未定义的符号

所以有三个问题:

1-为什么同一个静态库可以与gcc ld链接,而不能与armlink链接

2-gc部分不应该删除ld手册中未定义的符号吗

3-如果我通过添加必要的文件来解决所有未定义的符号,这会对库大小产生相当大的影响,还是只添加简单的引用

基尔: 编译器选项:

--c99-c--cpu Cortex-M4.fp-g-O0--apcs=interwork--split_sections-I.\inc-I.\STM32F4-Discovery_FW_V1.1.0\Libraries\cms4-Discovery_FW_V1.1.0\Libraries\CMSIS\Libraries\CMSIS\CMSIS\STM32F4xx\Include-I.\STM32F4-Discovery_FW_V1.1.0\Libraries\STM32F4;\STM32F4xx_FW_FW_FW_V1.1.1.0\librariers\C:\Keil\u v5\ARM\RV31\INC-I C:\Keil\u v5\ARM\PACK\ARM\CMSIS\3.20.4\CMSIS\Include -IC:\Keil\u v5\ARM\PACK\Keil\STM32F4xx\u DFP\1.0.6\Device\Include-dstm32f440\u 41xxx-DUSE\u STDPERIPH\u驱动程序-D\u INT\u MIC\u-DSTM32F4XX-o“.o”--依赖“.D”

链接器选项

--cpu Cortex-M4.fp*.o --严格--分散“test.sct” --cpu=Cortex-M4--详细--删除--摘要\u stderr--信息摘要大小--映射--外部参照--调用图--符号 --信息尺寸--信息总数--信息未使用--信息饰面 --列表“\test.map” -o test.axf

错误示例:

构建目标“测试” 链接。。。 .\test.axf:警告:L6413W:禁用mon_target.o(.rodata.str1.4)的合并,节包含未对齐的字符串。 .\test.axf:错误:L6218E:未定义的符号退出(从main.o引用)。 .\test.axf:错误:L6218E:未定义的符号生成(从main.o引用)。
\test.axf:Error:L6218E:Undefined symbol wonder\u clear(从callmain.o引用)

也许您应该给我们命令和错误消息。也许gnu ld删除的代码中有未定义的符号<代码>--gc部分将删除未使用的函数。如果这些未使用的函数有一个未定义的符号,那么您描述的所有内容都适用;除了
--gc section
没有删除未定义的符号,它会删除未使用的代码/数据。是的,这回答了问题2,但仍然无法理解为什么Keil的行为会有所不同,即使我添加了与gcc选项等效的split_section和--remove?