请问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 <guowenxue@gmail.com>
* 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 <guowenxue@gmail.com>

# * 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吗?下面是我的下程序帮忙看看有问题没?

本回答被提问者采纳

请问arm-linux-gcc和arm-linux-ld还有arm-linux-objcopy之间是什么关...
arm-linux-ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。arm-linux-gcc -wall -O2 -c -o $@ $< -o 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 -Wall 指定产生全部的警告信息 -O2 编译器对程序...

Linux嵌入式交叉编译工具链问题 浅谈
arm-linux-addr2line arm-linux-g++ arm-linux-ld arm-linux-sizearm-linux-ar arm-linux-gcc arm-linux-nm arm-linux-stringsarm-linux-as arm-linux-gcc-3.3.6 arm-linux-objcopy arm-linux-striparm-linux-c++ arm-linux-gccbug arm-linux-objdump fix-embedded-paths...

arm-linux-gcc 编译后,在开发板上没法运行
这些非常清楚以后,编译时除了用arm-linux-gcc外,要考虑怎么链接arm-linux-ld,然后还要将编译链接出来的文件进行去头处理arm-linux-objcopy。裸机开发程序大致是这样的。跑在linux之上的应用程序开发,简单的程序用arm-linux-gcc就可以了。

如何为嵌入式开发建立交叉编译环境
arm-linux-addr2line arm-linux-gasp arm-linux-objdump arm-linux-strings arm-linux-ar arm-linux-ld arm-linux-ranlib arm-linux-strip arm-linux-as arm-linux-nm arm-linux-readelf arm-linux-c++filt arm-linux-objcopy arm-linux-size 我们来解释一下上面生成的可执行文件都是用来干什么的 add2line -...

如何用代码实现动态重定位?
arm-linux-gcc -c -o start.ostart.S arm-linux-ld -Ttext 0 -Tdata 0x30000000 start.o led.ouart.o init.omain.o -o sdram.elf arm-linux-objcopy -O binary -Ssdram.elf sdram.bin arm-linux-objdump -D sdram.elf> sdram.dis clean:rm *.bin *.o *.elf *.dis 编译之后,...

求助s3c2410把nandflash中的程序搬到sdram中并运行的程序
arm-linux-gcc -c -o sdram.o sdram.c arm-linux-ld -Tnand.lds head.o mem.o flash.o nand_read.o sdram.o -o sdram_tmp.o arm-linux-objcopy -O binary -S sdram_tmp.o sdramclean: rm -f *.o rm -f sdram好了,你把这些文件拷下去,执行make命令就能生成可执行的二进制代码sdram,把sdram...

如何安装ARM toolchain
4. 测试。先开启一个新的终端机,输入 arm 後连续按两次 tab 键,如果跑出来一堆像下面的提示表示安装成功。arm-linux-gnueabihf-addr2line arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gfortran arm-linux-gnueabihf-objdump arm-linux-gnueabihf-ar arm-linux-gnueabihf-gcc-4.7.2 ...

Yocto编译杰发或MTK的linux或android时的几个问题
报错:make: armv7a-mediatek451_001_vfp-linux-gnueabi-gcc: Command not found 解决: $ vi atc_linux\/bootloader\/preuboot\/Makefile #CROSS_COMPILE :=armv7a-mediatek451_001_vfp-linux-gnueabi- CROSS_COMPILE :=arm-poky-linux-gnueabi- $ vi ..\/..\/atc_linux\/bootloader\/preuboot\/driver\/mmc\/include\/...

怎么安装arm-linux-gcc4.8
linux-2.6.34.14.tar.xz mpfr-3.1.2.tar.bz2 mpc-1.0.1.tar.gz gmp-5.1.3.tar.bz2 因为编译过程很费时,你要在bash配置文件中直接声明环境变量:vim ~\/.bashrc export TARGET=arm-linux-gnueabi export PREFIX=\/usr\/local\/arm\/4.8.2 export TARGET_PREFIX=$PREFIX\/$TARGET export ...

嵌入式系统中的存储器映射是怎么回事,为什么要映射
我是这样理解的:存储器空间是和硬件相关联的,可以对某些地址上写数据来控制硬件,为了方便使用(总不可能都用地址来直接控制,那样就工作量就太大了),将这些地址赋予了一些变量名,通过变量名来控制硬件(也就是寄存器的概念)。

相似回答