c - 如何在 C 中为外部定义的函数创建别名?

标签 c gcc alias weak

在编译此 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 .

尝试运行 nmmyimp2_augmented.o ,您会看到我们添加了符号。

现在您应该可以链接到 myimp2_augmented.o而不是 myimp.o你的程序可以调用coolguy没有链接错误。

关于c - 如何在 C 中为外部定义的函数创建别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48660176/

相关文章:

c - 在 C 命令行参数中为 argv 分配的缓冲区大小

c++ - 扫描速度慢的内存扫描器

C - 由 realloc 创建的数组的大小

svn - 为 svn 存储库创建别名

mysql - SQL 连接和排序

indexing - 如何创建排除特定字段的Elasticsearch索引别名

c99 内联语义与 gcc (mspgcc)

gcc - gperftools CPU 分析器究竟是如何启动的?

c++ -/usr/bin/ld :/tmp/cc9zxSDP. o: undefined symbol 引用

c - 带电围栏库的gcc不生效