要为外部函数设置别名,您可以使用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"))
的符号,0000000000000000,作为。如果您在页面中查找 nm,它会说这意味着它是该部分中的全局符号。这是有道理的,因为该功能不是并且包含指令(与数据相反)。coolguy
myadd
man
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
,你会看到我们已经添加了符号。
现在您应该能够链接 withmyimp2_augmented.o
而不是,myimp.o
并且您的程序可以coolguy
在没有链接错误的情况下调用。