我想允许重新定义已在头文件中定义的.c文件中的函数。根据GCC手册中的weakref属性:
效果相当于将对别名的所有引用移动到单独的转换单元,将别名重命名为别名符号,将其声明为弱,编译两个单独的转换单元并对它们执行可重新加载的链接。
这听起来就像我想要做的那样。 但是,以下示例不会编译错误:
tpp.c:18:13:错误:重新定义'foo' tpp.c:6:13:注意:'foo'的先前定义在这里
#include <sys/types.h>
#include <stdio.h>
/* this will be in a header file */
static void foo(void) __attribute__ ((weakref ("_foo")));
static void _foo(void)
{
printf("default foo\n");
}
/* in a .c file #including the header mentioned above */
#define CUSTOM_FOO
#ifdef CUSTOM_FOO
static void foo(void)
{
printf("user defined foo.\n");
}
#endif
int main(int argc, char **argv)
{
printf("calling foo.\n");
foo();
}
我是否正确使用此功能?我错过了什么?
gcc版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)
答案 0 :(得分:1)
据我了解,您需要将该函数定义为extern。 然后它对我有用,如下:
user@horst:$ cat weakref.c
#include <sys/types.h>
#include <stdio.h>
/* this will be in a header file */
extern void foo(void) __attribute__ ((weak, alias ("_foo")));
void _foo(void)
{
printf("default foo\n");
}
int main(int argc, char **argv)
{
printf("calling foo.\n");
foo();
}
user@horst:$ gcc weakref.c
user@horst:$ ./a.out
calling foo.
default foo
user@horst:$ cat weakrefUser.c
#include <stdio.h>
/* in a .c file #including the header mentioned above */
#define CUSTOM_FOO
#ifdef CUSTOM_FOO
void foo(void)
{
printf("user defined foo.\n");
}
#endif
user@horst:$ gcc -c weakrefUser.c
user@horst:$ gcc -c weakref.c
user@horst:$ gcc weakref.o weakrefUser.o
user@horst:$ ./a.out
calling foo.
user defined foo.
注1:它不适用于静态函数,对于weak属性,它必须是全局的。
注2:ELF目标“仅”支持弱符号。