c - PIC 共享库中不同的函数地址

标签 c shared-libraries dynamic-linking fpic

我有一个文件 ptr.c 作为

a@po:~/code/link_load$ cat ptr.c
int test()
{
     printf("in test1 %p\n",&test);
    return 0;
}

我创建了一个共享库作为

a@po:~/code/link_load$ gcc -fPIC -c ptr.c
a@po:~/code/link_load$ gcc -shared -o libptr.so ptr.o                                                                       

然后我从两个程序 p1.c 和 p2.c 调用测试,调用测试和 p1.c 在调用测试后休眠以确保两个可执行文件一起激活。

由于文本部分是共享的,所以我希望测试函数的地址相同。

但不是,为什么?

编辑:我猜打印的地址是虚拟地址。 如果这是真的,那么它映射到实际地址,这对于 p1 和 p2 都是相同的。

最佳答案

单个文件(例如,你的库的文本部分)可以映射到多个进程中的不同虚拟地址,同时仍然被共享。这就是这里发生的事情。

关于c - PIC 共享库中不同的函数地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30280306/

相关文章:

c - 汇编语言-工作原理

c - 使用 gcc 链接库的简单方法

c - 编译共享库时 -fPIC 是什么意思

linux - 为什么使用 GOT 引用共享对象中定义的非静态全局变量?

c++ - 使用动态链接从 .dll 库调用函数

printing - 通过 libcups 以编程方式打印双面打印的正确方法是什么?

c - 将字符串数组的地址传递给函数

使用 union 和匿名结构的 C 模数

c++ - lib 和带有 autoconf 的模块有什么区别

dynamic-linking - 切换到动态链接