gcc objcopy 和 ld 的区别

在Linux编译过程中,objcopy和ld是两个关键的命令。ld主要用于将多个包含elf头的.o文件链接成可执行文件,整合各部分如.bss、.text、.data等区域。而objcopy则主要用于去除elf头,适用于单板机器,确保程序能在没有操作系统的环境下运行,常在bootloader编写中使用。
摘要由CSDN通过智能技术生成

我们再linux 编译中 经常会用到这几个 编译指令: objcopy 和 ld 那么这两个命令 那么这两个命令有什么区别呢.

首先我们我们gcc 编译完成后的 .O 文件 是包含有elf 头的 这个头部没有任何实质的指令语句 只有一些编译器的系统信息。

首先对于多文件的复杂工程, 工程文件有很多 每个文件都拥有独立的 .bss .text .data 区域 所以ld 的一个作用就是把不同的.o 文件的 各个区域重新 连接起来。 组成一个 可执行的文件。

而objcopy 的作用就比较 单一了, 就是再没有操作系统的单板上运行 的程序 必须要去掉 elf 头,不然他没办法运行。 单板机器只会一条条指令 运行。 这个命令再bootloader 的编写中比较常见。

在Linux/Unix-like系统中,`export`命令用于设置环境变量,它允许你在当前 shell 或子shell 中更改环境变量的值。这些变量会影响后续命令的行为,特别是与编译器工具链相关的。 - **AS** (Assembler): 指的是汇编程序,如`as`,它用于将高级语言源代码转换为机器语言的可执行文件的中间表示形式。 - **LD** (Linker): 如`ld`,它负责连接程序的各个部分,包括库文件,形成可执行文件。 - **CC** (C Compiler): 如`gcc`,它是C语言编译器,用于编译C源代码。 - **CPP** (Preprocessor): 也称为`cpp`,是C/C++编译过程中的预处理器,处理包含宏定义、条件编译指令等的源代码。 - **AR** (Archiver): 如`ar`,如引用所说,用于创建、更新和提取库文件,管理库的成员。 - **NM** (Name List): `nm`命令用于显示链接对象或库中的符号名,如全局变量、函数等。 - **STRIP**: 用于删除二进制文件中的调试符号,减小文件大小,提高运行速度。 - **OBJCOPY**: 用于复制和转换二进制文件,如将可重定位文件转换为可执行文件或二进制文件到十六进制文件。 - **OBJDUMP**: 用于反汇编二进制文件,查看其内部结构。 要使用这些工具,通常在终端中输入相应的命令并指定参数。例如,要编译C源文件并链接,你可以这样操作: ```shell gcc -o output_file source_file.c ``` 然后,如果你想查看编译后的可执行文件的符号信息,可以使用`objdump`: ```shell objdump -t output_file ``` 设置环境变量`export`通常是在编辑器配置文件(如`.bashrc`或`.bash_profile`)中进行,以便在打开新终端会话时自动生效: ```bash export AS=/path/to/your/as export LD=/path/to/your/ld # ... 其他变量设置 ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值