weak属性是否仅适用于Linux GCC中的共享库?

时间:2012-07-06 15:30:18

标签: gcc shared-libraries weak-linking

我是Linux gcc的新手。我正在编写一个简单的代码来学习Linux gcc中的弱属性。

请参阅我的示例代码:

weakref.c,主文件。我希望文件可以使用或不使用foo方法定义。

#include <stdio.h>
extern void foo(void) __attribute__((weak));

int main() {
  if (foo){
    foo();
    printf ("foo is defined\n");
  } else {
    printf("foo is not defined\n");
  }
}

所以,我运行以下命令来编译并运行它:

gcc weakref.c -o main_static
./main_static

并且输出是“foo未定义”,这正是我所期望的。

然后我创建了一个新文件libfoo.c,见下文:

#include <stdio.h>

void  foo() {
  printf("Print in foo.\n");
}

我尝试了三种方法来尝试使用libfoo.c使主文件工作:

  1. 编译libfoo.c和weakref.c并链接目标文件。
  2. 将libfoo.c编译为静态库,并将其与weakref.c的目标文件链接。
  3. 将libfoo.c编译为共享库,并将其与weakref.c的目标文件链接。
  4. 只有第3种方式有效并获得以下输出:

    Print in foo.
    foo is defined
    

    如果弱参考仅适用于共享库,请告诉我,为什么?非常感谢!

1 个答案:

答案 0 :(得分:3)

  

如果弱参考仅适用于共享库

,请告诉我

完全没有。

预计1.和3.都会生成“foo is defined”。

2. 期望从libfoo.o提取libfoo.a,因为来自weakref.o的未解析的弱引用不会被视为未解析的符号从归档库中提取对象。但是,您可以将强制 libfoo.o拉入链接,如下所示:gcc weakref.o -lfoo -ufoo,然后您应该再次获得“foo is defined”。

现在我说明了应该发生了什么,让我们看看这种做法是否同意。来自Linux / x86_64系统的脚本,使用gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303

$ gcc -c weakref.c libfoo.c
$ ar ruv libfoo.a libfoo.o
ar: creating libfoo.a
a - libfoo.o
$ gcc weakref.o && ./a.out
foo is not defined

这是你的#1:

$ gcc weakref.o libfoo.o && ./a.out
Print in foo.
foo is defined

正如你所看到的那样#1“正常”,而不是你声称的那样。你一定是在某个地方弄错了。

这是你的#2:

$ gcc weakref.o -L. -lfoo && ./a.out
foo is not defined

再次#2,但强制将libfoo.o拉入链接:

$ gcc weakref.o -L. -lfoo -ufoo && ./a.out
Print in foo.
foo is defined