请问arm-linux-gcc和arm-linux-ld还有arm-linux-objcopy之间是什么关系

今天我安装了arm-linux-gc,执行make命令后还是不能生成bin文件,整个程序是我对和书打的,应该不会有错,我怀疑是不是我没安装arm-linuxld和arm-linux-objcopy的原因,请问大侠这三者是什么关系,需要分别安装吗?
.text
.global _start
_start:
LDR R0,=0X56000010
MOV R1,# 0X00000400

STR R1,[R0]
LDR R0,=0X56000014

MOV R1,#0X00000000

STR R1,[R0]

MAIN_LOOP:
B MAIN_LOOP
Makefile文件:
led_on.bin: led_on.S
arm-linux-gcc -g -c -o led_on.o led_on.S
arm-linux-gcc -Ttext 0x0000000 -g led_on.o -o led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
rm -f led_on.bin led_on_elf *.o

arm-linux-ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。

arm-linux-gcc -wall -O2 -c -o $@ $<
-o 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
-Wall 指定产生全部的警告信息
-O2 编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高
-c 表示只要求编译器进行编译,而不要进行链接,生成以源文件的文件名命名但把其后缀由 .c 或 .cc 变成 .o 的目标文件
-S 只激活预处理和编译,就是指把文件编译成为汇编代码
arm-linux-ld 直接指定代码段,数据段,BSS段的起始地址
-Tbss ADDRESS Set address of .bss section

-Tdata ADDRESS Set address of .data section

-Ttext ADDRESS Set address of .text section
示例:
${CROSS}ld -Ttext=0x33000000 led.o -o led.elf
使用连接脚本设置地址:
arm-linux-ld -Tbeep.lds start.o beep.o -o beep.elf
其中beep.lds 为连接脚本如下:
arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换
示例:
arm-linux-objcopy –o binary –S elf_file bin_file
常用的选项:
input-file , outflie
输入和输出文件,如果没有outfile,则输出文件名为输入文件名
2.-l bfdname或—input-target=bfdname
用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则arm-linux-objcopy自己分析
3.-O bfdname 输出的格式
4.-F bfdname 同时指明源文件,目的文件的格式
5.-R sectionname 从输出文件中删除掉所有名为sectionname的段
6.-S 不从源文件中复制重定位信息和符号信息到目标文件中
7.-g 不从源文件中复制调试符号到目标文件中
arm-linux-objdump
查看目标文件(.o文件)和库文件(.a文件)信息
arm-linux-objdump -D -m arm beep.elf > beep.dis
-D 显示文件中所有汇编信息
-m machine

指定反汇编目标文件时使用的架构,当待反汇编文件本身没有描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构.
[guowenxue@localhost asm_c_buzzer]$ cat beep.lds
/***********************************************************************
* File: beep.lds
* Version: 1.0.0
* Copyright: 2011 (c) Guo Wenxue <[email protected]>
* Description: Cross tool link text, refer to u-boot.lds
* ChangeLog: 1, Release initial version on "Mon Mar 21 21:09:52 CST 2011"
*
**********************************************************************/
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS{
. = 0x33000000;
.text : {

*(.text)
*(.rodata)
}

.data ALIGN(4): {

*(.data)

}
.bss ALIGN(4): {

*(.bss)

}

}

[guowenxue@localhost asm_c_buzzer]$ cat makefile

# ***********************************************************************

# * File: makefile

# * Version: 1.0.0

# * Copyright: 2011 (c) Guo Wenxue <[email protected]>

# * Description: Makefile used to cross compile the ASM and C source code

# * ChangeLog: 1, Release initial version on "Mon Mar 21 21:09:52 CST 2011"

# *
# ***********************************************************************
CROSS = /opt/buildroot-2011.02/arm920t/usr/bin/arm-linux-
CFLAGS =
beep.bin: start.S beep.c
arm-linux-gcc $(CFLAGS) -c -o start.o start.S

arm-linux-gcc $(CFLAGS) -c -o beep.o beep.c

arm-linux-ld -Tbeep.lds start.o beep.o -o beep.elf

arm-linux-objcopy -O binary -S beep.elf beep.bin

rm -f *.elf *.o
install:
cp beep.bin ~/winxp -f --reply=yes
clean:
rm -f *.elf *.o
rm -f beep.bin
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-08
gcc是编译器,负责对c代码的编译, ld是连接器 负责将多个*.o的目标文件链接成elf可执行文件。elf可执行文件是unix常用的可执行文件类型,就像windows的exe文件。elf文件中有很多信息包括段信息还有头信息,这些信息对硬件是没有意义的,所以有的时候我们通过objcopy将elf转化成bin 文件加载到内存中运行,bin文件就是一个纯二进制文件,并且你可以通过objdump将elf文件来反汇编。
全部手打 希望对你有帮助追问

需要分别安装arm-linux-objcopy、arm-linux-gcc、arm-linux-ld吗?下面是我的下程序帮忙看看有问题没?

本回答被提问者采纳
相似回答