链接器从 libc 中选择的 strncpy 而不是 rom 版本

strncpy chosen by linker from libc instead of rom version

我为 ESP8266 芯片使用 106Micro 内核和 Xtensa 工具链 (gcc)。

不确定使用的是什么 strncpy 函数

根据地图文件

 .text          0x4010077c       0xfa c:/sysgcc/esp8266/bin/../lib/gcc/xtensa-lx106-elf/5.2.0/../../../../xtensa-lx106-elf/lib\libc.a(lib_a-strncpy.o)
                0x401007b4                strncpy

而且在 ROM 中,已经存在一个同名的函数

        0x4000c0a0                PROVIDE (strncpy, 0x4000c0a0)

因为如果 libc 中的函数以二进制形式存在,似乎 ROM 被忽略了。很可能我没有为 ROM one 定义原型(因为 ESP8266 有许多 ROM 函数没有解释,没有任何类型的原型)并且由于选择了 libc。

现在如何包含ROM版本,但保留程序?

感谢您的澄清,

不清楚您使用的 linker 是什么,但是对于 GNU ld,PROVIDE directive(语法略有不同)用于:

[...] define a symbol only if it is referenced and is not defined by any object included in the link.

因为您提供了 libc,因此 strncpy 的定义将覆盖 PROVIDEstrncpy

如果从 link 中删除 libc,则该符号将由 PROVIDE 指令解析。如果您没有明确地 linking libc,您可能需要使用 link 选项 --nodefaultlibs or --nostdlib 来防止 linking 已经提供的代码。