ARM体系架构--Ubuntu开发环境,gcc工具链的使用

配置交叉工具链:


1,解压交叉工具链:
mkdir /usr/local/arm
chmod 777 /usr/local/arm
tar -jxvf toolchain-4.5.1.tar.bz2  -C /usr/local/arm/


2,设置环境变量path
vim ~/.bashrc
export PATH=$PATH:/usr/local/arm/toolchain-4.5.1/bin


3,source ~/.bashrc  // 更新该文件


george_JI@ubuntu:~$ arm-none-linux-gnueabi-
arm-none-linux-gnueabi-addr2line  arm-none-linux-gnueabi-gcc        arm-none-linux-gnueabi-objcopy
arm-none-linux-gnueabi-ar         arm-none-linux-gnueabi-gcc-4.5.1  arm-none-linux-gnueabi-objdump
arm-none-linux-gnueabi-as         arm-none-linux-gnueabi-gccbug     arm-none-linux-gnueabi-populate
arm-none-linux-gnueabi-c++        arm-none-linux-gnueabi-gcov       arm-none-linux-gnueabi-ranlib
arm-none-linux-gnueabi-cc         arm-none-linux-gnueabi-gprof      arm-none-linux-gnueabi-readelf
arm-none-linux-gnueabi-c++filt    arm-none-linux-gnueabi-ld         arm-none-linux-gnueabi-size
arm-none-linux-gnueabi-cpp        arm-none-linux-gnueabi-ldd        arm-none-linux-gnueabi-strings
arm-none-linux-gnueabi-g++        arm-none-linux-gnueabi-nm         arm-none-linux-gnueabi-strip


预编译
george_JI@ubuntu:~/arm/test$ gcc -E test.c -o test.i
编译
george_JI@ubuntu:~/arm/test$ gcc -S test.i -o test.s
george_JI@ubuntu:~/arm/test$ arm-none-linux-gnueabi-gcc -S test.i -o test_arm.s
汇编
george_JI@ubuntu:~/arm/test$ gcc -c test.s -o test.o
连接:
ld /usr/lib/i386-linux-gnu/crt1.o /usr/lib/i386-linux-gnu/crti.o /usr/lib/i386-linux-gnu/crtn.o test.o -o test -lc -dynamic-linker /lib/ld-linux.so.2




george_JI@ubuntu:~/arm/test$ readelf -h test
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0x80482c0
  Start of program headers:          52 (bytes into file)
  Start of section headers:          1596 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         7
  Size of section headers:           40 (bytes)
  Number of section headers:         24
  Section header string table index: 21


george_JI@ubuntu:~/arm/test$ size test
   text    data     bss     dec     hex filename
    838     232       0    1070     42e test


george_JI@ubuntu:~/arm/test$ nm test
08049468 d _DYNAMIC
08049534 d _GLOBAL_OFFSET_TABLE_
08048394 R _IO_stdin_used
08049550 A __bss_start
0804954c D __data_start
         w __gmon_start__
08048372 T __i686.get_pc_thunk.bx
08049468 d __init_array_end
08049468 d __init_array_start
08048370 T __libc_csu_fini
08048300 T __libc_csu_init
         U __libc_start_main@@GLIBC_2.0
08049550 A _edata
08049550 A _end
08048378 T _fini
08048390 R _fp_hw
08048254 T _init
080482c0 T _start
0804954c W data_start
080482e4 T main
         U puts@@GLIBC_2.0




strip: 瘦身, 将一些不必要的段去掉
george_JI@ubuntu:~/arm/test$ ls -lh test
-rwxrwxr-x 1 george_JI george_JI 3.5K Mar 13 20:03 test
george_JI@ubuntu:~/arm/test$ strip test
george_JI@ubuntu:~/arm/test$ ls -lh test
-rwxrwxr-x 1 george_JI george_JI 2.5K Mar 13 20:14 test


objdump: 查看反汇编代码
objdump -D test > test.dis


arm-none-linux-gnueabi-objdump -D test_arm > test_arm.dis


147 00008304 <_start>:
148     8304:       e3a0b000        mov     fp, #0
149     8308:       e3a0e000        mov     lr, #0




objcopy : 格式转换, 将elf格式转换成bin文件


arm-none-linux-gnueabi-objcopy -O binary test_arm test_arm.bin




有文件需要编译: start.S , ledc.c
arm-none-linux-gnueabi-gcc -c start.S -o start.o
arm-none-linux-gnueabi-gcc -c ledc.c -o ledc.o
arm-none-linux-gnueabi-ld -Ttext 0x40008000 start.o ledc.o -o led_elf
arm-none-linux-gnueabi-objdump -D led_elf > led_elf.dis
arm-none-linux-gnueabi-objcopy -O binary led_elf led_elf.bin


非常简单Makefile
all : led_elf.bin
led_elf.bin : start.S ledc.c
        arm-none-linux-gnueabi-gcc -c start.S -o start.o
        arm-none-linux-gnueabi-gcc -c ledc.c -o ledc.o
        arm-none-linux-gnueabi-ld -Ttext 0x40008000 start.o ledc.o -o led_elf
        arm-none-linux-gnueabi-objdump -D led_elf > led_elf.dis
        arm-none-linux-gnueabi-objcopy -O binary led_elf led_elf.bin


clean :
        rm -rf *.o *.bin *_elf *.dis *.swp *.tgz




稍微完善一点:
CROSS_COMPILE = arm-none-linux-gnueabi-


TARGET = led_test
OBJS = start.o ledc.o




all : $(TARGET)


$(TARGET) : $(OBJS)
        $(CROSS_COMPILE)ld -Ttext 0x40008000 $(OBJS) -o $(TARGET)
        $(CROSS_COMPILE)objdump -D $(TARGET) > $(TARGET).dis
        $(CROSS_COMPILE)objcopy -O binary $(TARGET) $(TARGET).bin




%.o : %.c
        $(CROSS_COMPILE)gcc -c $^ -o $@


%.o : %.S
        $(CROSS_COMPILE)gcc -c $^ -o $@


%.o : %.s
        $(CROSS_COMPILE)gcc -c $^ -o $@


clean :
        rm -rf $(OBJS) $(TARGET) *.bin *_elf *.dis *.swp *.tgz




连接脚本*.lds, 用于规定目标文件中各个段分布


OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)  // 入口函数
SECTIONS // 描述各个段
{
. = 0x40008000;  // . 表示当前 第一条指令的位置0x40008000;
. = ALIGN(4);   // ALIGN(4)并且存储在这里的指令数据都是4字节对齐
.text      :  // 目标文件中.text : {   *所有被连接elf文件的text()}
{
start.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : 
{ *(.rodata) }
    . = ALIGN(4);
    .data : 
{ *(.data) }
    . = ALIGN(4);
    .bss :
     { *(.bss) }
}


如果要使用连接脚本:
$(CROSS_COMPILE)ld -Tmap.lds $(OBJS) -o $(TARGET)

你可能感兴趣的:(ARM体系)