.weak汇编程序宏为MinGW GCC / C替代

时间:2013-10-31 10:13:49

标签: c assembly macros weak

我有一个带有一些不同库/对象的模块化C-Project,如果满足某些条件,它们只链接到该版本。该项目使用GCC 3.4.4为PowerPC构建。

所以在我的项目中,有一些C-Files使用来自其他模块的函数(这些模块不一定被添加到构建中)。所以这些函数被声明为extern。

根据版本的不同,包含功能本身的模块是否链接。为了避免未定义的引用,使用汇编程序宏将这些函数声明为弱。

我试图用一个例子来证明这一点:

ModuleA.c(核心模块)

extern void bar(void);
void foo(void)
{
    // Do some Stuff    
    bar();
}

ModuleB.c(可选模块)

void bar(void)
{
    // Do some stuff
}

ModuleB并不总是链接到ModuleA,仅在某些特定的版本构建中。所以有第三个C-File

weakfuncs.c(核心模块)

#define WEAK(x,y) __asm__(".weak " #x "\n.set " #x "," #y "\n");
void empty_function(void);
__asm__("empty_function:\nblr\n");
WEAK(bar,empty_function)

使用此宏,项目始终构建(如果ModuleB已链接,将从ModuleB调用bar(),如果未链接ModuleB,bar()将仅调用empty_function()。< / p>

由于整个项目中有很多这些案例,我的前任正在weakfuncs.c收集所有这些功能。

到目前为止,这是我只是重用的遗留代码

现在我想用MinGW(GCC 4.8.1)为Windows编译整个东西。 我的问题是编译器似乎有汇编指令的问题:

__asm__("empty_function:\nblr\n");

根本不工作(他不知道blr命令),但这不是问题,因为我可以像这样在C中实现一个空函数:

void empty_function(void)
{
    return;
}

WEAK宏本身

#define WEAK(x,y) __asm__(".weak " #x "\n.set " #x "," #y "\n");

编译没有问题,但它没有效果,这意味着,未链接的函数会导致“未定义的引用”,即使我在它们上面运行了WEAK宏。

现在我知道gcc中有一种方法可以为函数赋予弱的属性:

extern void bar() __attribute__((weak));

这实际上有效,但由于有很多功能都需要进行调整,我宁愿在我的weakfuncs.c中用宏来做。

是否有任何汇编程序指令或C中的方法这样做,而不是在整个placE中查找所有函数的变换?

1 个答案:

答案 0 :(得分:1)

这个怎么样?

void empty_function(void)
{
    return;
}
#define WEAK(x,y) extern void x() __attribute__((weak, alias(#y)));