链接器从libc而不是rom版本

时间:2018-01-19 18:16:39

标签: c embedded microcontroller libc

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

不确定使用什么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一个定义的原型(因为ESP8266有许多ROM功能没有解释,没有原型的ykind)并且由于选择了libc。

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

感谢您的澄清,

1 个答案:

答案 0 :(得分:1)

目前尚不清楚您使用的链接器,但对于GNU ld,PROVIDE directive(语法略有不同)用于:

  

[...]仅在引用符号时定义符号,并且未由链接中包含的任何对象定义。

因为您提供了libc,因此提供了//Protocol View Controller 1 protocol InfoCellDelegate: class { func buttonToDetailCell() } // Inside ViewController 1 class func buttonToDetailCell() { let vc = InfoViewController(collectionViewLayout: UICollectionViewFlowLayout()) navigationController?.pushViewController(vc, animated: true) } // UICollectionViewCell weak var delegate: InfoCellDelegate? @objc func InfoButtonPressed(_ sender: UIButton) { if cellOne.text != "" { delegate?.buttonToDetailCell() } } 的定义,然后它将覆盖strncpy' ed PROVIDE

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