为什么在使用GCC的 -fno-math-errno时,impure_data仍然存在?

前端开发 2026-07-12

我正在为一个RAM为 1KiB的 MSPM0C微控制器构建一个应用程序。使用 中的sqrt,结果libg.a占据了全部的1KiB。我确定是sqrt,因为简单地移除sqrt操作就能解决这个问题。不过我也在使用 里的abs。

 .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.alibc.alibm.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

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章