-rdynamic
(或链接程序级别的--export-dynamic
)到底做了什么,它与-fvisibility*
标志或可见性pragma
和__attribute__
定义的符号可见性有何关系?
对于--export-dynamic
,ld(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
成为共享库一个由
dlopen
的libbar
并从该库中调用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/