如果题主问的是物理内存的话,回答是不确定。物理内存哪里有空就加载到哪里。
如果题主问的是虚拟内存的话,可以用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的标准库。后面括号里的十六进制数就是这个库加载的地址。