首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在静态库中使gcc链接强符号来覆盖弱符号?

如何在静态库中使gcc链接强符号来覆盖弱符号?
EN

Stack Overflow用户
提问于 2018-03-18 02:44:44
回答 2查看 0关注 0票数 0

我的问题可以概括如下:

bar.c

代码语言:javascript
复制
#include <stdio.h>

void bar() {
    printf("bar\n");
}

main.c

代码语言:javascript
复制
#include <stdio.h>

void __attribute__((weak)) bar() {
    printf("foo\n");
}

int main() {
    bar();
    return 0;
}

Makefile

代码语言:javascript
复制
all:
    gcc -c bar.c
    ar -rc libbar.a bar.o
    gcc main.c -L. -lbar

输出

代码语言:javascript
复制
$ ./a.out
foo

因此,bar.c中的强符号不会覆盖main.c中的弱符号,因为bar.c会链接到静态库libbar.a中的main.c。

EN

回答 2

Stack Overflow用户

发布于 2018-03-18 11:04:53

阅读http://www.bottomupcs.com/libraries_and_the_linker.html -

我自己做了一个测试:

bar.c

代码语言:javascript
复制
#include <stdio.h>

void bar()
{
        puts("bar.c: i'm the strong bar()");
}

baz.c

代码语言:javascript
复制
#include <stdio.h>

void __attribute__((weak)) bar() 
{
        puts("baz.c: i'm the weak bar()");
}

main.c中

代码语言:javascript
复制
#include <stdio.h>

#ifdef V2
        void __attribute__((weak)) bar()
        {
                puts("main: i'm the build in weak bar()");
        }
#else
        void __attribute__((weak)) bar();
#endif

int main()
{
    bar();
    return 0;
}

我的Makefile:

代码语言:javascript
复制
all:
    gcc -c -o bar.o bar.c
    gcc -shared -fPIC -o libbar.so bar.o
    gcc -c -o baz.o baz.c
    gcc -shared -fPIC -o libbaz.so baz.o
    gcc -o main1 main.c -L. -lbar -lbaz
    gcc -o main2 main.c -L. -lbaz -lbar
    LD_LIBRARY_PATH=. ./main1                                   # => bar.c
    LD_LIBRARY_PATH=. ./main2                                   # => baz.c
    LD_LIBRARY_PATH=. LD_PRELOAD=libbaz.so ./main1              # => baz.c (!!)
    LD_LIBRARY_PATH=. LD_PRELOAD=libbaz.so ./main2              # => baz.c
    gcc -o main3 main.c bar.o baz.o
    gcc -o main4 main.c baz.o bar.o
    ./main3                                                     # => bar.c
    ./main4                                                     # => bar.c
    gcc -DV2 -o main5 main.c -L. -lbar -lbaz
    gcc -DV2 -o main6 main.c -L. -lbaz -lbar
    LD_LIBRARY_PATH=. ./main5                                   # => main's implementation
    LD_LIBRARY_PATH=. ./main6                                   # => main's implementation
    gcc -DV2 -o main7 main.c -L. -lbar -lbaz
    gcc -DV2 -o main8 main.c -L. -lbaz -lbar
    LD_LIBRARY_PATH=. LD_PRELOAD=libbaz.so ./main7              # => main's implementation
    LD_LIBRARY_PATH=. LD_PRELOAD=libbaz.so ./main8              # => main's implementation
    gcc -DV2 -o main9  main.c -L. -lbar -lbaz
    gcc -DV2 -o main10 main.c -L. -lbaz -lbar
    LD_LIBRARY_PATH=. LD_PRELOAD=libbar.so ./main9              # => main's implementation
    LD_LIBRARY_PATH=. LD_PRELOAD=libbar.so ./main10             # => main's implementation
    gcc -c bar.c
    gcc -c baz.c
    gcc -o main11 main.c bar.o baz.o
    gcc -o main12 main.c baz.o bar.o
    ./main11                                                    # => bar.c
    ./main12                                                    # => bar.c
    gcc -o main13 -DV2 main.c bar.o baz.o
    gcc -o main14 -DV2 main.c baz.o bar.o
    ./main13                                                    # => bar.c
    ./main14                                                    # => bar.c
票数 0
EN

Stack Overflow用户

发布于 2018-03-18 11:44:49

可以使用该--whole-archive选项更改此默认。如下所示:

代码语言:javascript
复制
gcc main.c -L. -Wl,--whole-archive -lbar -Wl,--no-whole-archive

然后你会看到:

代码语言:javascript
复制
$ ./a.out
bar
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档