可执行文件的入口函数
1 对于静态链接的可执行文件,程序入口就是ELF文件头标记的entry
2 对于动态链接的可执行文件,程序入口就是.interp段标记的动态链接器地址,执行完动态加载和重定位后,再交给entry
关于.so的执行
1 so文件也是可以执行的,和exe一样,都是通过execve()执行,只是入口函数不一样(entry or .interp)
2 windows也一样,rundll32.exe就是用来执行dll文件的
静态链接和动态链接
1 静态链接,由ld负责,搜索静态路径
2 动态链接,由ld.so负责加载,搜索动态路径
静态搜索路径和动态搜索路径
1 静态搜索路径,详情看man ld
2 动态搜索路径,详情看man ld.so
关于exe的静态链接
1 查找所有依赖的.so是否存在(搜索静态路径)
2 查找命令行中的.so依赖的.so是否存在(搜索动态路径)
2 检查所有.o文件的未定义符号是否存在(在所有.o文件和所有.so中查找)
3 检查所有.so文件的未定义符号是否存在(在所有.o文件和所有.so中查找)
4 合并所有.o文件(即所有代码合并,所有符号表合并,链接时的重定位)
关于静态库的生成
一个温馨小提示,始终将 -l函数库 选项放在编译命令行的最右边
gcc -llua -lm calllua.c(报错)
gcc calllua.c -llua -lm(正确)
网友评论