弱化的汇编宏,用于MinGW GCC / C替代方案

3
我有一个模块化的C项目,其中包含一些不同的库/对象,只有在满足某些条件时才会链接到发布版。该项目使用GCC 3.4.4 for PowerPC构建。
因此,在我的整个项目中,有一些C文件使用其他模块的函数(这些模块不一定添加到构建中)。因此,这些函数被声明为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文件。
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()
由于整个项目中存在许多这些情况,我的前任正在收集所有这些函数并将其放在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");

编译没有问题,但是没有效果,即未连接的函数会导致“undefined reference”错误,即使我已经在它们上面运行了WEAK宏。

现在我知道在gcc中有一种方法可以像这样给函数赋予弱属性:

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

这个实际上是可行的,但是由于有很多函数都需要适应,我更喜欢用宏在我的 weakfuncs.c 中来完成。

有没有汇编指令或C语言的方法来做到这一点,而不必改变所有地方的函数声明?


函数应该是b lr,对于ARM CPU来说需要一个空格。 - undefined
1个回答

1
这是什么意思?
void empty_function(void)
{
    return;
}
#define WEAK(x,y) extern void x() __attribute__((weak, alias(#y)));

很不幸,这个方法不起作用 - 我其实不知道为什么,但我认为这与函数在模块文件(例如ModuleA.c)中被声明了一次有关,而且是作为外部函数,然后又在weakfuncs中再次声明 - 而汇编代码则改变了该符号的属性。 - undefined
@Toby:哦!看起来这是MingW链接器中已知的错误。请尝试更新的答案作为一种解决方法,实际上更接近原始代码。 - undefined
这个也不起作用,我仍然得到未定义的引用错误。我不确定,但我认为问题与函数在ModuleA.c中使用extern void bar(void)定义有关。现在我不知道为什么没有明确的错误提示,但你建议的宏会有区别吗?因为bar()已经声明了...所以...? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接