我有一个模块化的C项目,其中包含一些不同的库/对象,只有在满足某些条件的情况下才会链接到版本。此项目是使用 GCC 3.4.4 for PowerPC 构建的。
所以在我的项目中,有一些C文件使用其他模块的功能(这些模块不一定添加到构建中)。因此,这些函数被声明为 extern。
根据版本,包含函数本身的模块是否链接。为了避免未定义的引用,这些函数使用汇编程序宏声明为弱函数。
我试图用一个例子来说明这一点:
模块A.c(核心模块)
extern void bar(void);
void foo(void)
{
// Do some Stuff
bar();
}
模块 B.c (可选模块)
void bar(void)
{
// Do some stuff
}
模块 B 并不总是链接到模块 A,仅在某些特定的发布版本中。所以有第三个C文件
弱函数c.c (核心模块)
#define WEAK(x,y) __asm__(".weak " #x "n.set " #x "," #y "n");
void empty_function(void);
__asm__("empty_function:nblrn");
WEAK(bar,empty_function)
使用此宏,项目始终构建(如果模块 B 已链接,则从模块 B 调用bar()
,如果没有链接模块 B,则bar()
将只调用 empty_function()
。
由于整个项目中有很多这样的案例,我的前任在weakfuncs.c
中收集了所有这些功能。
到目前为止,这是我只是重用的遗留代码
现在我想用MinGW(GCC 4.8.1)编译Windows的整个内容。我的问题是编译器似乎对汇编指令有问题:
__asm__("empty_function:nblrn");
根本不起作用(他不知道blr
命令),但这不是问题,因为我可以在 C 中实现一个空函数,如下所示:
void empty_function(void)
{
return;
}
弱宏本身
#define WEAK(x,y) __asm__(".weak " #x "n.set " #x "," #y "n");
编译没有问题,但它没有效果,这意味着,未链接的函数将导致"未定义的引用",即使我确实在它们上运行了 WEAK 宏。
现在我知道 gcc 中有一种方法可以像这样赋予函数属性弱:
extern void bar() __attribute__((weak));
这实际上有效,但由于有很多功能都需要适应,我更愿意在我的weakfuncs.c
中使用宏来做到这一点。
C中是否有任何汇编指令或方法可以做到这一点,而无需在整个平台上追逐所有函数降级?
这个呢?
void empty_function(void)
{
return;
}
#define WEAK(x,y) extern void x() __attribute__((weak, alias(#y)));