在为 RV32IM 目标 (RISC-V) 用 C 语言开发裸机固件时,我在启用 LTO 时遇到了链接错误:
/home/duranda/riscv/lib/gcc/riscv64-unknown-elf/10.2.0/../../../../riscv64-unknown-elf/bin/ld: /tmp/firmware.elf.5cZNyC.ltrans0.ltrans.o: in function `.L0 ':
/home/duranda/whatever/firmware.c:493: undefined reference to `memset'
但是,我的固件中没有调用memset
。由memset
GCC 在优化期间插入,如此处所述。-Os
该构建使用 GCC和-flto -fuse-linker-plugin
标志针对大小进行了优化。此外,这些-fno-builtin-memset -nostdinc -fno-tree-loop-distribute-patterns -nostdlib -ffreestanding
标志用于防止memset
在优化期间使用,并且不包括标准库。
memset
LTO期间如何防止插入?请注意,固件不应与 libc 链接。我还尝试提供自定义实现,memset
但链接器不想memset
在优化期间将其用于插入(仍然抛出未定义的引用)。