0

写文件,一个是弱文件,另一个是普通符号。以下是文件的内容: 其中 weak_ex() 是用弱符号声明的定义。

bgl-ads-2997:~/weak_symbol > cat mc

#include <stdio.h>
#include "weak.h"
void main (){
    printf ("weak = %d\n", weak_ex());
}

bgl-ads-2997:~/weak_symbol > cat weak.c

int __attribute__((weak)) weak_ex()
{
    return 1;
}

bgl-ads-2997:~/weak_symbol > cat strong.c

int weak_ex()
{
    return 10;
}

bgl-ads-2997:~/weak_symbol > cat weak.h

int weak_ex();

所以使用上述定义,弱符号将返回 1,而强符号将返回 10。

他们将它们编译如下:

gcc -g -c -o m.o m.c
gcc -g -c -o weak.o weak.c
gcc -g -c -o strong.o strong.c
gcc -shared -fpic -o libstrong.so strong.o
gcc -shared -fpic -o libweak.so weak.o

然后链接它们并执行如下:

  1. 仅使用目标文件:

    bgl-ads-2997:~/weak_symbol > gcc mo weak.o strong.o -L -Wl pwd,-R pwd-o shared

    bgl-ads-2997:~/weak_symbol > ./shared

    弱 = 10

在这种情况下,弱符号被屏蔽。和预期的一样强信号。

  1. 与对象文件中的星期符号和共享对象中的强符号链接。

    bgl-ads-2997:~/weak_symbol > gcc -lstrong mo weak.o -L -Wl pwd,-R pwd-o shared

    bgl-ads-2997:~/weak_symbol > ./shared

    弱 = 1

在这种情况下,弱符号不会被替换。

似乎符号在编译时被解析,而不是作为执行的一部分,不考虑共享期望这也打印 10 但不是这样,那么这是预期的行为吗?有没有办法从共享库中替换周符号?

4

0 回答 0