我使用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版本,但保留在程序中?
感谢您的澄清,
答案 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
来阻止链接已提供的代码。