Laz*_*zer 4 c linux gcc shared-libraries
我试图了解C中共享库的以下行为
机器一
$ cat one.c
#include<stdio.h>
int main() {
printf ("%d", 45);
}
$ gcc one.c -o one -O3
$ ldd one
linux-gate.so.1 => (0x00331000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00bc2000)
/lib/ld-linux.so.2 (0x006dc000)
$ cat two.c
int main() {
int i = 0;
}
$ gcc two.c -o two -O3
$ ldd two
linux-gate.so.1 => (0x006f7000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00eb0000)
$
Run Code Online (Sandbox Code Playgroud)
机器二
$ cat three.c
#include<stdio.h>
int main() {
printf ("%d", 45);
}
$ gcc three.c -o three -O3
$ ldd three
/usr/lib/libcwait.so (0xb7ffd000)
libc.so.6 => /lib/tls/i686/nosegneg/libc.so.6 (0x002de000)
/lib/ld-linux.so.2 (0x002bf000)
$
Run Code Online (Sandbox Code Playgroud)
我目前还不完全了解的一些事情:
括号中给出的地址(例如(0x002de000))是什么意思?
即使对于同一台机器上的同一个库,这些地址也是不同的,这表明这些地址是加载这些库的内存中的位置的地址.但是,如果这是真的,为什么这些库根本加载到内存中(我还没有执行程序,它们不应该仅在运行时加载吗?).
为什么two需要任何库?我用过-O3,汇编输出是
$ gcc two.c -S -O3
$ cat two.s
.file "two.c"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
popl %ebp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
$
Run Code Online (Sandbox Code Playgroud)
什么库有什么需要?
在机器二上,为什么/usr/lib/libcwait.so要使用而不是linux-gate.so.1?
我认为这是因为Machine Two上的内核很老(2.6.9)并且库linux-gate.so.1不可用.这是什么原因?
括号中给出的地址(例如,(0x002de000))是什么意思?
它是加载库的(虚拟)内存地址.最近的系统可以提供随机加载库的位置,因此调用地址可能会有所不同.
它们不应该只在运行时加载吗?
对,他们是.ldd经历了与在运行时完成的大致相同的过程,以便能够找出各种各样的东西.
为什么两个都需要任何库?
libc.so.6是标准的C库(和其他东西,比如内核的接口),并且总是以ny默认链接.gcc可以选择控制它,例如-nostdlib旗帜
ld-linux.so是一个动态加载器,可以加载/重定位其他共享库并运行您的应用程序.ld-linux.so的联机帮助页为您提供了详细信息.
linux-gate.so.1是一个虚拟库,它只存在于内核的内存中.它用于执行对内核的系统调用,并根据您的CPU找出最有效的方法.这可能比你的其他2.6.9内核机器晚了.
我不知道/usr/lib/libcwait.so是什么,但你可以通过执行rpm -qif /usr/lib/libcwait.so获得一些信息.
| 归档时间: |
|
| 查看次数: |
1158 次 |
| 最近记录: |