-rdynamic(或链接程序级别的--export-dynamic)到底做了什么,它与-fvisibility*标志或可见性pragma__attribute__定义的符号可见性有何关系?

对于--export-dynamicld(1)提到:



我不确定我是否完全理解这一点。您能否提供一个没有-rdynamic却无法使用的示例?

编辑:
我实际上尝试使用和不使用-rdynamic来编译几个虚拟库(单个文件,多个文件,各种-O级别,一些函数间调用,一些隐藏符号,一些可见),到目前为止,我一直在获得字节相同的输出(当然,当保持所有其他标志不变时),这非常令人困惑。

最佳答案

这是一个简单的示例项目,用于说明-rdynamic的用法。

bar.c

extern void foo(void);

void bar(void)
{
    foo();
}

main.c
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>

void foo(void)
{
    puts("Hello world");
}

int main(void)
{
    void * dlh = dlopen("./libbar.so", RTLD_NOW);
    if (!dlh) {
        fprintf(stderr, "%s\n", dlerror());
        exit(EXIT_FAILURE);
    }
    void (*bar)(void) = dlsym(dlh,"bar");
    if (!bar) {
        fprintf(stderr, "%s\n", dlerror());
        exit(EXIT_FAILURE);
    }
    bar();
    return 0;
}

Makefile
.PHONY: all clean test

LDEXTRAFLAGS ?=

all: prog

bar.o: bar.c
    gcc -c -Wall -fpic -o $@ $<

libbar.so: bar.o
    gcc -shared -o $@ $<

main.o: main.c
    gcc -c -Wall -o $@ $<

prog: main.o | libbar.so
    gcc $(LDEXTRAFLAGS) -o $@ $< -L. -lbar -ldl

clean:
    rm -f *.o *.so prog

test: prog
    ./$<

在这里,bar.c成为共享库libbar.so,而main.c成为共享库
一个由dlopenlibbar并从该库中调用bar()的程序。bar()调用foo(),它在bar.c中是外部的,并且在main.c中定义。

因此,没有-rdynamic:
$ make test
gcc -c -Wall -o main.o main.c
gcc -c -Wall -fpic -o bar.o bar.c
gcc -shared -o libbar.so bar.o
gcc  -o prog main.o -L. -lbar -ldl
./prog
./libbar.so: undefined symbol: foo
Makefile:23: recipe for target 'test' failed

并使用-rdynamic:
$ make clean
rm -f *.o *.so prog
$ make test LDEXTRAFLAGS=-rdynamic
gcc -c -Wall -o main.o main.c
gcc -c -Wall -fpic -o bar.o bar.c
gcc -shared -o libbar.so bar.o
gcc -rdynamic -o prog main.o -L. -lbar -ldl
./prog
Hello world

关于c - `-rdynamic`到底要做什么?何时需要?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36692315/

10-11 15:13