gpt4 book ai didi

c - 链接器从 libc 选择 strncpy 而不是 rom 版本

转载 作者:行者123 更新时间:2023-11-30 19:06:18 29 4
gpt4 key购买 nike

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

不确定使用什么 strncpy 函数

根据 map 文件

 .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 定义原型(prototype)(因为 ESP8266 有许多未解释的 ROM 函数,没有一种原型(prototype))并且由于选择了 libc。

现在我怎样才能包含 ROM 版本,但保留程序中的内容?

感谢您的澄清,

最佳答案

尚不清楚您使用的是什么链接器,但对于 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

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

关于c - 链接器从 libc 选择 strncpy 而不是 rom 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48347235/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com