大家好,又见面了,我是你们的朋友全栈君。
准备工作
#include <stdio.h> //此程序很简单,仅仅打印一个 Hello World 的字符串。
int main(void) {
printf("Hello World! \n");
return 0;
}
预处理基本操作
hello.i文件
将预处理生成的 hello.i 文件编译生成汇编程序 hello.s
汇编过程调用对汇编代码进行处理,生成处理器能识别的指令,保存在后缀为.o 的目标文件中。
将编译生成的 hello.s 文件汇编生成目标文件 hello.o GCC 的选项-c 使 GCC 在执行完汇编后停止,生成目标文件
text链接静态库,代码尺寸变得极大
没有链接动态库
gcc hello.c -o hello
链接了许多其他的动态库,主要是linux系统glibc 动态库
链接器链接后生成的最终文件为 ELF 格式可执行文件,一个 ELF 可执行文件通常 被链接为不同的段,常见的段譬如.text、.data、.rodata、.bss 等段
.text:已编译程序的指令代码段。 .rodata:ro 代表 read only,即只读数据(譬如常数 const)。 .data:已初始化的 C 程序全局变量和静态局部变量。 .bss:未初始化的 C 程序全局变量和静态局部变量。 .debug:调试符号表,调试器用此段的信息帮助调试。
由于 ELF 文件无法被当做普通文本文件打开,如果希望直接查看一个 ELF 文件包 含的指令和数据,需要使用反汇编的方法
使用 objdump -S 将其反汇编并且将其 C 语言源代码混合显示出来:
gcc 的-S 选项,表示在程序编译期间,在生成汇编代码后,停止,-o 输出汇编代码文件。
gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test
静态库链接时搜索路径顺序:
动态链接时、执行时搜索路径顺序:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/182494.html原文链接:https://javaforall.cn