.弱汇编器宏用于MinGW GCC / C替代方案



我有一个模块化的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)));

最新更新