myproc1.c的程序如下:# include < stdio . h > void myfunc10{ printf (" This is myfunc1!\ n "); myproc2.c的程序如下:# include < stdio . h > void myfunc20{ printf (" This is myfunc2\ n "); 用如下两行命令生成 mylib . a 静态库文件。$ gcc - c myproc1.cmyproc2.c $ ar rcs mylib . a myproc1.omyproc2.o main . c 程序如下: void myfunc1( viod ); int main () myfunc10; return 0; 用命令$ gcc - cmain . c 生成 main . o 。 请你对$ gcc - static - o myproc main . o ./ myl ib . a 静态链接的符号解析过程进行简要说明。其中函数的调用关系: main →myfunc1→ prin tf 。
时间: 2023-07-14 16:13:57 浏览: 139
shellcode 代码VC程序编写
4星 · 用户满意度95%
静态链接的符号解析过程如下:
1. 编译器加载 main.o 和 mylib.a 两个目标文件,开始进行符号解析和重定位。
2. 首先,编译器发现 main.o 中调用了 myfunc1 函数,但是在 main.o 中并没有找到该函数的定义,因此需要在 mylib.a 中查找。
3. 编译器在 mylib.a 中找到了 myfunc1 的定义,并将其复制到可执行文件中。
4. 接下来,编译器发现 myfunc1 中调用了 printf 函数,但是同样没有在 mylib.a 中找到该函数的定义,因此需要在系统库中查找。
5. 编译器在系统库中找到了 printf 的定义,并将其复制到可执行文件中。
6. 最后,所有的符号都已经解析完毕,编译器进行重定位,将代码中的地址引用替换为实际的地址,生成最终的可执行文件 myproc。
因此,最终的执行顺序为:main → myfunc1 → printf。在执行过程中,myfunc1 和 printf 函数都是在静态库 mylib.a 中被链接进来的。
阅读全文