首先,不论是可执行程序还是动静态库,本质都是磁盘上的文件。
其次,不管是加载还是运行,第一步都是要先找到文件,所以在运行可执行程序时,前面需要加 ./ ,加载库时,都需要路径来帮助编译器/程序找到那个库。
动态库使用的整体轮廓:
动态库在加载之后,要映射到当前进程地址空间上的堆栈之间的共享区。
每多一个进程要用这个动态库的时候,并不需要把这个动态库从磁盘中再加载一份到内存中,这个进程只需要将该动态库与其地址空间中的共享区建立映射关系就好了。
补充:动态库也叫做共享库。
我们的可执行程序,编译成功后,没有加载运行时,它的二进制代码中,也是包含了“地址”的。-- 可用 objdump -S 可执行程序名 命令查看该可执行程序的汇编代码。
补充:我们用语言(C、C++...)编写的程序,它的源代码中的 变量名、函数名 ,在它被翻译成二进制的代码之后,这些 变量名、函数名 就都不在了,变成了“地址”。
补充:我们一般在 Linux 当中形成的可执行程序,它的格式叫做:ELF格式的可执行程序。
二进制是有自己的固定格式的,它一定要有它对应的elf可执行程序的头部,头部有着很多可执行程序的属性。
可执行程序编译之后,会变成很多行的汇编语句,每条汇编语句都有它的地址。
问题:程序未加载时,这些地址是什么地址?编译器又是如何对这些汇编语句进行编址的?
答:首先,编址一定要有编址范围,目前认为我们的编址范围就是:000...000 ~ fff...fff。以 000...000

2484

被折叠的 条评论
为什么被折叠?



