在编译此 C 代码期间
extern void Default_Handler(void);
void NMI_Handler(void) __attribute__ ((weak, alias ("Default_Handler")));
我收到了这个
error: 'NMI_Handler' aliased to undefined symbol 'Default_Handler'
如何在外部定义的函数上创建别名?
编译器:
gcc version 7.2.1 20170904 (release) [ARM/embedded-7-branch revision 255204] (GNU Tools for Arm Embedded Processors 7-2017-q4-major)
最佳答案
要别名外部函数,您可以使用 objcopy
.下面是一个例子:
假设我有一个函数的定义,我给它取了别名,就像下面的程序(叫做 myimp.c
):
// myimp.c
int
myadd(int x, int y)
{
return x+y;
}
int
coolguy (int x, int y) __attribute__((alias("myadd")));
如果我们编译它(但不链接),我们会得到一个目标文件,我们可以查看它的符号:
# compile
$ cc -c myimp.c
# look at the symbols
$ nm myimp.o
0000000000000000 T coolguy
0000000000000000 T myadd
所以我们可以看到
__attribute__((alias("myadd"))
只是添加一个符号 coolguy
具有相同的值,0000000000000000,作为 myadd
.如果您查看 man
nm 的页面,它会说 T
表示它是 .text
中的全局符号部分。这是有道理的,因为函数不是 static
并包含指令(与数据相反)。所以如果我们有目标文件,但没有源文件,并且我们想添加一个函数别名,我们可以使用
objcopy --add-symbol
.假设我们有编译这个源代码的目标文件:
// myimp2.c
int
myadd(int x, int y)
{
return x+y;
}
如上编译,我们将得到
myimp2.o
,其符号表工具如下:# look at the symbols
$ nm myimp2.o
0000000000000000 T myadd
所以我们要添加
coolguy
符号,我们做如下# objcopy --add-symbol coolguy=.text:0000000000000000,global myimp2.o myimp2_augmented.o
查看
--add-symbol
上的文档在 objcopy
man
页。基本上.text
指定部分,冒号后是值,然后是 global
我通过传递错误类型和 objcopy
发现失败并告诉我有效类型的列表,我从中选择了 global
.尝试运行
nm
在 myimp2_augmented.o
,您会看到我们添加了符号。现在您应该可以链接到
myimp2_augmented.o
而不是 myimp.o
你的程序可以调用coolguy
没有链接错误。
关于c - 如何在 C 中为外部定义的函数创建别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48660176/