1、__attribute__((alias)) 函数属性使你能够为一个函数指定多个别名。
2、需要注意的是别名必须和原函数具有相同的类型
3、不能在块范围内指定别名。编译器忽略附加到局部函数定义的别名属性,并将函数定义视为普通的局部定义。
4、在输出对象文件中,编译器将别名调用替换为对原始函数名的调用,并在原始名称旁边发出别名。例如:
static int oldname(int x, int y)
{
return x + y;
}
static int newname(int x, int y) __attribute__((alias("oldname")));
int caller(int x, int y)
{
return oldname(x,y) + newname(x,y);
}
编译输出文件为
AREA ||.text||, CODE, READONLY, ALIGN=2
newname ; Alternate entry point
oldname PROC
MOV r2,r0
ADD r0,r2,r1
BX lr
ENDP
caller PROC
PUSH {r4,r5,lr}
MOV r3,r0
MOV r4,r1
MOV r1,r4
MOV r0,r3
BL oldname
MOV r5,r0
MOV r1,r4
MOV r0,r3
BL oldname
ADD r0,r0,r5
POP {r4,r5,pc}
ENDP
5、这个函数属性是ARM编译器支持的GNU编译器扩展。
6、变量名称也可以使用这个属性扩展
7、语法
return-type newname([argument-list]) __attribute__((alias("oldname")));
oldname:需要另起别名的函数
newname:新的别名
示例
#include <stdio.h>
void foo(void)
{
printf("%s\n", __FUNCTION__);
}
void bar(void) __attribute__((alias("foo")));
int main(int argc, char *argv[])
{
bar(); // calls foo
}
/** 程序输出结果
foo
*/