为什么在使用GCC的 -fno-math-errno时,impure_data仍然存在?
我正在为一个RAM为 1KiB的 MSPM0C微控制器构建一个应用程序。使用
.data.impure_data
0x20000020 0x428 C:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/lib/thumb/v6-m/nofp\libg.a(lib_a-impure.o)
0x20000448 . = ALIGN (0x8)
0x20000448 __data_end__ = .
据我所知,impure_data子区段的存在是因为errno的处理。根据这篇文章和GCC文档,通过 -fno-math-errno 将其移除应该可以去掉errno的处理。
它为什么仍然出现?libg.a还有其他用途吗?
指定 --specs=nano.specs 通过把impure_data的大小缩小到0x60B来解决我的内存问题。使用nano.specs究竟有哪些影响?
编译器标志:
-mcpu=cortex-m0plus
-march=armv6-m -mthumb
-mfloat-abi=soft
-I"C:/MYPATH/src"
-I"C:/MYPATH/src/modules"
-I"C:/MYPATH/src/modules/myfunc"
-I"C:/MYPATH/src/modules/communication"
-I"C:/MYPATH/src/modules/lib"
-I"C:/MYPATH/src/modules/battery"
-I"C:/MYPATH/src/modules/accelerometer"
-I"C:/MYPATH"
-I"C:/MYPATH/Debug"
-I"C:/TI/mspm0_sdk_2_09_00_01/source/third_party/CMSIS/Core/Include"
-I"C:/TI/mspm0_sdk_2_09_00_01/source"
-I"C:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/include/newlib-nano"
-I"C:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/include"
-O2
-ffunction-sections
-fdata-sections
-g
-gdwarf-3
-gstrict-dwarf
-Wall
-fno-math-errno
链接器标志:
-Wl,-Map,"brixxi_gen2.map"
-nostartfiles
-static
-Wl,--gc-sections
-L"C:/TI/mspm0_sdk_2_09_00_01/source/ti/driverlib/lib/gcc/m0p/mspm0c110x"
-L"C:/TI/mspm0_sdk_2_09_00_01/source"
-L"C:/MYPATH"
-L"C:/MYPATH/Debug/syscfg"
-L"C:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/lib/thumb/v6-m/nofp"
-march=armv6-m
-mthumb
--specs=nosys.specs
编辑:
在指定 -fno-math-errno -nostdlib -lc 之后,我临时解决了这个问题。当时我甚至没有调用使用 sqrt 的那个函数。现在我去调用那个函数时,出现对 __errno 等未定义引用。
以下是我的详细输出
[4]"C:/TI/gcc_arm_none_eabi_9_2_1/bin/arm-none-eabi-gcc-9.2.1.exe" @"device.opt" -O2 -ffunction-sections -fdata-sections -g -gdwarf-3 -gstrict-dwarf -Wall -v -fno-math-errno -nostdlib -lc -mthumb -mfloat-abi=soft -Wl,-Map,"myproj.map" -nostartfiles -nostdlib -static -Wl,--gc-sections -L"C:/TI/mspm0_sdk_2_09_00_01/source/ti/driverlib/lib/gcc/m0p/mspm0c110x" -L"C:/TI/mspm0_sdk_2_09_00_01/source" -L"C:/MYPATH" -L"C:/MYPATH/Debug/syscfg" -L"C:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/lib/thumb/v6-m/nofp" -march=armv6-m -mthumb --specs=nosys.specs -fno-math-errno-nostdlib -lc -v -o"myproj.out" "./ti_msp_dl_config.o" "./startup_mspm0c110x_gcc.o" "./main.o" "./src/modules/accelerometer/accelerometer_LIS2DW12.o" "./src/modules/battery/battery.o" "./src/modules/sdklib/communication.o" "./src/modules/rear_light/rear_light.o" -Wl,-T"../make/myproj.lds" -Wl,-Tdevice.lds.genlibs -l:driverlib.a -lgcc -lc -lm
[5]Using built-in specs.
[6]Reading specs from c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/lib/nosys.specs
[7]rename spec link_gcc_c_sequence to nosys_link_gcc_c_sequence
[8]COLLECT_GCC=C:/TI/gcc_arm_none_eabi_9_2_1/bin/arm-none-eabi-gcc-9.2.1.exe
[9]COLLECT_LTO_WRAPPER=c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/lto-wrapper.exe
[10]Target: arm-none-eabi
[11]Configured with: /mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/src/gcc/configure --build=x86_64-linux-gnu --host=i686-w64-mingw32 --target=arm-none-eabi --prefix=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/install-mingw --libexecdir=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/install-mingw/lib --infodir=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/install-mingw/share/doc/gcc-arm-none-eabi/info --mandir=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/install-mingw/share/doc/gcc-arm-none-eabi/man --htmldir=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/install-mingw/share/doc/gcc-arm-none-eabi/html --pdfdir=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/install-mingw/share/doc/gcc-arm-none-eabi/pdf --enable-languages=c,c++ --enable-mingw-wildcard --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-headers=yes --with-newlib --with-python-dir=share/gcc-arm-none-eabi --with-sysroot=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/install-mingw/arm-none-eabi --with-libiconv-prefix=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/build-mingw/host-libs/usr --with-gmp=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/build-mingw/host-libs/usr --with-mpfr=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/build-mingw/host-libs/usr --with-mpc=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/build-mingw/host-libs/usr --with-isl=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/build-mingw/host-libs/usr --with-libelf=/mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/build-mingw/host-libs/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-pkgversion='GNU Tools for Arm Embedded Processors 9-2019-q4-major' --with-multilib-list=rmprofile
[12]Thread model: single
[13]gcc version 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599] (GNU Tools for Arm Embedded Processors 9-2019-q4-major)
[14]COMPILER_PATH=c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/;c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/;c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/
[15]LIBRARY_PATH=c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/thumb/v6-m/nofp/;c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/;c:/ti/gcc_arm_none_eabi_9_2_1/bin/../arm-none-eabi/lib/thumb/v6-m/nofp/;c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/;c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/;c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/lib/;c:/ti/gcc_arm_none_eabi_9_2_1/bin/../arm-none-eabi/lib/
[16]COLLECT_GCC_OPTIONS='-D' '__MSPM0C1104__' '-D' '__USE_SYSCONFIG__' '-O2' '-ffunction-sections' '-fdata-sections' '-g' '-gdwarf-3' '-gstrict-dwarf' '-Wall' '-v' '-nostdlib' '-mfloat-abi=soft' '-nostartfiles' '-nostdlib' '-static' '-LC:/TI/mspm0_sdk_2_09_00_01/source/ti/driverlib/lib/gcc/m0p/mspm0c110x' '-LC:/TI/mspm0_sdk_2_09_00_01/source' '-LC:/MYPATH' '-LC:/MYPATH/Debug/syscfg' '-LC:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/lib/thumb/v6-m/nofp' '-mthumb' '-specs=nosys.specs' '-fno-math-errno' '-nostdlib' '-v' '-o' 'myproj.out' '-march=armv6-m'
[17] c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/collect2.exe -plugin c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/liblto_plugin-0.dll -plugin-opt=c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\RAE41~1.HTT\AppData\Local\Temp\1\ccH8STd9.res --sysroot=c:\ti\gcc_arm_none_eabi_9_2_1\bin\../arm-none-eabi -Bstatic -X -o myproj.out @C:\Users\RAE41~1.HTT\AppData\Local\Temp\1\cco681E8 -Lc:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/thumb/v6-m/nofp -Lc:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp -Lc:/ti/gcc_arm_none_eabi_9_2_1/bin/../arm-none-eabi/lib/thumb/v6-m/nofp -Lc:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1 -Lc:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc -Lc:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/lib -Lc:/ti/gcc_arm_none_eabi_9_2_1/bin/../arm-none-eabi/lib @C:\Users\RAE41~1.HTT\AppData\Local\Temp\1\ccjX9Ra8
[18]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: C:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/lib/thumb/v6-m/nofp\libm.a(lib_a-w_sqrt.o): in function `sqrt':
[19]w_sqrt.c:(.text.sqrt+0x2a): undefined reference to `__aeabi_dcmpun'
[20]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: w_sqrt.c:(.text.sqrt+0x3c): undefined reference to `__aeabi_dcmplt'
[21]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: w_sqrt.c:(.text.sqrt+0x82): undefined reference to `__errno'
[22]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: w_sqrt.c:(.text.sqrt+0xb2): undefined reference to `__errno'
[23]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: C:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/lib/thumb/v6-m/nofp\libm.a(lib_a-e_sqrt.o): in function `__ieee754_sqrt':
[24]e_sqrt.c:(.text.__ieee754_sqrt+0x164): undefined reference to `__aeabi_dmul'
[25]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: e_sqrt.c:(.text.__ieee754_sqrt+0x16c): undefined reference to `__aeabi_dadd'
[26]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: e_sqrt.c:(.text.__ieee754_sqrt+0x17e): undefined reference to `__aeabi_dsub'
[27]collect2.exe: error: ld returned 1 exit status
编辑2:
我已经确认 libcc.a、libc.a 和 libm.a 包含了所谓的未定义函数
更新后的链接命令:
@"device.opt"
-O2
-ffunction-sections
-fdata-sections
-g
-gdwarf-3
-gstrict-dwarf
-Wall
-v
-fno-math-errno
-mthumb
-mfloat-abi=soft
-Wl,-Map,"myproj.map"
-nostartfiles
-nostdlib
-Wl,--gc-sections
-L"C:/TI/mspm0_sdk_2_09_00_01/source/ti/driverlib/lib/gcc/m0p/mspm0c110x"
-L"C:/TI/mspm0_sdk_2_09_00_01/source"
-L"C:/MYPROJ"
-L"C:/MYPROJ/Debug/syscfg"
-L"C:/TI/gcc_arm_none_eabi_9_2_1/lib/gcc/arm-none-eabi/9.2.1"
-L"C:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/lib/thumb/v6-m/nofp"
-l:driverlib.a
-march=armv6-m
-mthumb
--specs=nosys.specs
-v
-o"myproj.out"
"./ti_msp_dl_config.o"
"./startup_mspm0c110x_gcc.o"
"./main.o"
"./src/modules/accelerometer/accelerometer_LIS2DW12.o"
"./src/modules/battery/battery.o"
"./src/modules/sdk_libs/communication/communication.o"
"./src/modules/rear_light/rear_light.o"
-Wl,-T"../make/myproj.lds"
-Wl,-Tdevice.lds.genlibs
-lc
-lgcc
-lm
结果:
[18]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: C:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/lib/thumb/v6-m/nofp\libm.a(lib_a-w_sqrt.o): in function `sqrt':
[19]w_sqrt.c:(.text.sqrt+0x2a): undefined reference to `__aeabi_dcmpun'
[20]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: w_sqrt.c:(.text.sqrt+0x3c): undefined reference to `__aeabi_dcmplt'
[21]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: w_sqrt.c:(.text.sqrt+0x82): undefined reference to `__errno'
[22]c:/ti/gcc_arm_none_eabi_9_2_1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: w_sqrt.c:(.text.sqrt+0xb2): undefined reference to `__errno'
如果把 -lc -lgcc -lm 提前,使它们在任何.o文件之前被指定,我会得到对 __libc_init_array __aeabi_idiv __aeabi_i2f __aeabi_fmul __aeabi_fdiv __aeabi_f2iz __aeabi_uidiv __aeabi_i2d sqrt __aeabi_ddiv __aeabi_d2iz 的未定义引用错误
.map文件的链接输出(此情形):
LOAD C:/TI/gcc_arm_none_eabi_9_2_1/lib/gcc/arm-none-eabi/9.2.1\libgcc.a
LOAD C:/TI/gcc_arm_none_eabi_9_2_1/arm-none-eabi/lib/thumb/v6-m/nofp\libm.a
LOAD C:/TI/mspm0_sdk_2_09_00_01/source/ti/driverlib/lib/gcc/m0p/mspm0c110x/driverlib.a
LOAD ./ti_msp_dl_config.o
LOAD ./startup_mspm0c110x_gcc.o
LOAD ./main.o
LOAD ./src/modules/accelerometer/accelerometer_LIS2DW12.o
LOAD ./src/modules/battery/battery.o
LOAD ./src/modules/sdk_libs/communication/communication.o
LOAD ./src/modules/rear_light/rear_light.o```
解决方案
指定 -nostdlib -lc 无论是否提供 -g 都解决了问题。
假设这些选项将 libg.a 替换为 libc.a,从而使 -fno_math_errno 选项能够被考虑。
至于为何即使指定 -l PATHTOLIB/libc.a 也没有优先权,我不确定。我确实把它放在包含 libg.a 的路径之前,尽管我不确定这是否相关。
要在使用 sqrt 之后解决后续问题,~~简单地使用一个分组来解决库之间的循环依赖。 -Wl,--start-group -Wl,-Tdevice.lds.genlibs -lc -lgcc -lm -l:driverlib.a -Wl,--end-group~~ 库搜索的顺序必须被改变。-lm -lgcc -lc 可以顺利工作,因为 libm.a 依赖于 libc.a