0

我正在尝试将符号的文件与标头中生成的损坏的文件链接起来。(将 ROM 定位的功能与 RAM 的功能相匹配。)

在 .sym 中,我有一个带有“ PFvv ”参数的函数,通常被分解为 -> VOID (fn*)(VOID)。

编译器改为生成以下输出作为参数:PFYvv

结果:链接器没有链接。

问题

Y 代表什么?是否有 ARM mangling 的参考文档?

.sym 错位名称:

_ZN10CCasd15lolEP13strPcPFvvEhPvm

编译器生成的名称:

_ZN10CCasd15lolEP13strPcPFYvvEhPvm

.h 定义

class CCasd{
    static int lol(in_str*h, char* name, void(*fn)(void), unsigned char p, void *s, unsigned long l);
};

回复后代码

以下是生成 PFvv 和 PFYvv 重整名称的方法:

#ifdef          __cplusplus
extern  "C" {                               /* C declarations in C++     */
#endif

class CCASD {
public:
    static int lol(in_str*h, char* name, void(*fn)(void), unsigned char p, void *s, unsigned long l);//Will be PFYvv
};

#ifdef          __cplusplus
}                                           /* End of C declarations     */
#endif

class CCASD {
public:
    static int lol(in_str*h, char* name, void(*fn)(void), unsigned char p, void *s, unsigned long l);//Will be PFvv
};
4

1 回答 1

2

显然,ARM ABI 基于更常见的 Itanium ABI(在链接文档中列举了一些修改)。

所以我们前往那里......并发现来自您Y<function-type>“指向函数的指针”类型的产生,并具有以下解释

裸函数类型的“Y”前缀在实现中对外部“C”进行编码,以区分具有“C”和“C++”语言链接的函数类型。这仅影响类型修饰,因为 extern "C" 函数对象具有未修饰的名称。

至于您是否拥有其中一种实现(我的意思是一般而言;显然您的就是其中之一),这个答案值得一读。

于 2019-06-14T17:37:28.210 回答