linux定位so快捷方式_Linux下.so动态库被调用时,会被加载到内存的哪个位置?

本文探讨了Linux下.so动态库在被调用时的加载位置。物理内存中,动态库加载位置不确定,取决于可用空间。虚拟内存中,可以通过ldd或readelf等命令查询。举例说明了readelf如何显示动态链接信息,以及ldd如何显示库的加载地址。
摘要由CSDN通过智能技术生成

如果题主问的是物理内存的话,回答是不确定。物理内存哪里有空就加载到哪里。

如果题主问的是虚拟内存的话,可以用ldd或者readelf这类命令查询。比如我随手写了一个测试程序,就用printf输出一行Hello world

$ readelf -r test

Relocation section '.rela.dyn' at offset 0x480 contains 8 entries:

Offset Info Type Sym. Value Sym. Name + Addend

000000003de8 000000000008 R_X86_64_RELATIVE 1130

000000003df0 000000000008 R_X86_64_RELATIVE 10e0

000000004028 000000000008 R_X86_64_RELATIVE 4028

000000003fd8 000100000006 R_X86_64_GLOB_DAT 0000000000000000 _ITM_deregisterTM[...] + 0

000000003fe0 000300000006 R_X86_64_GLOB_DAT 0000000000000000 __libc_start_main@GLIBC_2.2.5 + 0

000000003fe8 000400000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0

000000003ff0 000500000006 R_X86_64_GLOB_DAT 0000000000000000 _ITM_registerTMCl[...] + 0

000000003ff8 000600000006 R_X86_64_GLOB_DAT 0000000000000000 __cxa_finalize@GLIBC_2.2.5 + 0

Relocation section '.rela.plt' at offset 0x540 contains 1 entry:

Offset Info Type Sym. Value Sym. Name + Addend

000000004018 000200000007 R_X86_64_JUMP_SLO 0000000000000000 puts@GLIBC_2.2.5 + 0

可以看到符号表里面记录了各种符号的偏移量和类型。printf实际编译成了对puts的调用,因为我输出的是字符串常量。这里的偏移量是相对于这个段而言的,在编译时期就确定的。

然后用ldd可以查看加载的库的位置,比如

$ ldd test

linux-vdso.so.1 (0x00007ffd361aa000)

libc.so.6 => /usr/lib/libc.so.6 (0x00007f4ad5b49000)

/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f4ad5d3a000)

这个测试程序只需要上述三个库,libc.so.6就是C的标准库。后面括号里的十六进制数就是这个库加载的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值