嵌入式linux入门-常用命令介绍

使用芯片手册的时候,会时常的看到芯片中有的位填写的数字有保留,那是为了以后芯片升级和扩展使用的,现在是不使用。如GPF4占用的[9:8] 00 = Input,01 = Output, 10 = EINT, 11 = Reserved 保留位是为了以后进行扩展使用,现在使用不上。

使用虚拟机VMware有4种网络连接方式:网桥网络(Bridged)、网络地址翻译网络(NAT)、仅为主机网络(Host-only)和客户网络。常用的网络连接方式是前两种。
网桥网络需要连上网线才可以使用,当主机与目标板之间需要进行网络通讯的时候使用这种方式,它相当于三台处于同一网段的计算机,没有使用网线的时候使用NAT网络在主操作系统Windows与客户操作系统Linux间进行通讯。

UBUNTU中使用软件维护工具:qpt-get安装没有安装的软件

何为mount

mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要访问这个文件夹,就相当于访问该分区了。 目前mount已经不仅仅局限于Linux了。在Windows系统下的应用也越来越广了,多用在虚拟光驱类软件上

在刚学习嵌入式linux时候,尽量使用已经制作好的工具链接
我使用的是韦东山制作好的嵌入式P40页

  • -C

在程序编译器之前加上“-c”,只会进行预处理、编译和汇编源文件,但是不作连接。GCC会忽略-c选项之后任何无法识别的输入文件。

  • -S
    编译之后立即停止,不进行汇编。GCC忽略任何不需要汇编的输入文件

  • -E
    预处理之后即停止,不进行编译,忽略任何不需要预处理的输入文件。

  • -o file
    指定输出文件为file,无论是预处理、编译、汇编还是连接,这个选项都可以使用。

  • -v
    显示制作GCC工具时的自身配置命令;同时显示编译器驱动程序、预处理器、编译器的版本号。

调试选项

  • -g以操作系统的本地格式(stabs、COFF、XCOFF、或DWARF)、产生调试信息,GDB能够使用这些调试信息。

优化选项

  • -O或-O1, 不使用 - -O或-O1的时候只有声明了register的变量才能分配使用寄存器。
  • -O2多优化一些。除了涉及空间和速度交换的优化选项,执行几乎所有的优化工作,例如不进行循环展开(loop unrolling)和函数内嵌(inling)。和-O相比增加了代码的编译时间,也提高了生成代码的运行效果。

  • -O3优化的更多。除了打开-O2所做的一切还打开了,“-finline-functions”选项

  • -O0如果指定了多个”-O”选项,不管带不带数字都是最后一个生效

连接器选项

  • -llibrary 即使不明显的使用-llibrarya选项,一些默认的库也被连接进去,可以使用”-v”选项看到这点
gcc -v -o test main.o sub.o
  • -nostartfiles 不连接系统标准启动文件,而标准库文件任然正常使用
gcc -v -nostartfiles -o test main.o sub.o
  • -nostdlib 不连接系统标准启动文件和标准文件,只把指定的文件传递给连接器,这个选项常用语编译内核、bootloader等程序,它们不需要启动文件、标准库文件。
gcc -v -nostdlib -o test main.o sub.o
  • -static 在支持动态链接的系统上阻止链接共享库。使用和不使用”-static”选项编译出来的可执行程序的大小相差很大
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o test_static main.o sub.o -static
gcc -o test main.o sub.o
ls -l test test_static
-rwxrwxr-x 1 book book   8664 74 14:54 test
-rwxrwxr-x 1 book book 912728 74 14:53 test_static
book@www.100ask.org:~/work/test$ 

当不使用-static进行编译文件时,程序执行前还需要使用共享文件库文件,所以还需要将共享文件库放入文件系统中。

  • -shared
    生成一个共享OBJ文件,他可以和其他OBJ文件连接产生可执行文件,只有部分系统支持该选项,当不想以源代码发布程序的时候可以使用”-shared”选项生成库文件,比如对于options程序可以如下制作成库文件
gcc -c -o sub.o sub.c
gcc -shared -o sub.a sub.o

以后要使用sub.c中的函数sub_fun时,再连接程序的时候,将sub.a加入即可,比如:

gcc -o test main.o ./sub.a

可以将多个文件制作成一个库文件,比如:

gcc -shared -o sub.o sub2.o sub3.o

目录选项

下列选项指定搜索路径,用于查找头文件、库文件或编译器的某些成员。

  • -Idir
    在头文件的搜索路径中添加dir目录。头文件搜索的方法为:如果以”#include <>”包含头文件,则在标准的头文件目录开始搜索(包含使用-Idir选项定义的目录),如果以”#include ” ” “包含的文件,则先从用户的工作目录开始搜索,在搜索标准库目录。
  • -I-
    任何在”-I-“前面使用的”-I”选项指定的搜索路径只适用于”#include “file” “这种情况,

arm-linux-ld 选项

arm-linux-ld 用于将多个目标文件、库文件连接成可执行文件,本小节主要介绍”-T”选项,可以直接使用它指定代码段、数据段、bss段的起始地址,也可以制定一个连接脚本在连接脚本中进行复杂的地址设置。
“-T”选项只用于连接Bootloader、内核等“没有底层软件支持”的软件,连接运行于操作系统之上的应用程序,无需指定”-T”选项,它们使用默认的方式进行连接。

  • 直接指定代码段、数据段、bss段的起始地址
    格式如下:
-Ttext  startaddr
-Tdata  startaddr
-Tbss   startaddr

其中的”startaddr”分别代表代码段、数据段和bss段的起始地址,它是一个十六进制的数。
在led_on的Makefile中有如下语句:

arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf

它表示的代码段运行的地址为0x0000000,由于没有定义数据段、bss段的起始地址,它们被依次放到代码段的后面

  • 使用链接脚本设置地址
    在/work/source/hardware/timer的目录下的程序为例,他的Makefile中有如下代码:
arm-linux-ld -Ttimer.lds -o timer_elf head.o int.o interrupt.o main.o

使用链接脚本timer.lds来设置可执行文件timer_elf的地址信息,timer_elf文件内容如下:

SECTIONS {
    . = 30000000;
    .text     :{ *(.text) }
    .rodata ALLGN{4} : { *(.rodata) }
    .data ALIGN{4}  :  { *(.data) }
    .bss ALIGN{4}  :  { *(.bss)  *(COMMON)}
}

链接脚本的基本命令是SECTIONS命令,他描述了输出文件的映射图:输出文件中各段、各文件怎样设置。一个SECTIONS 内部包含了一个或多个段,段(section)是链接脚本的基本单元,他表示输入文件中的某个部分怎样放置。

  • arm-linux-objcopy选项
    arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,可以使用不同的源文件格式。在嵌入式中常使用arm-linux-objcopy命令将ELF格式的生成结果转换为二进制文件,比如:
arm-linux-objcopy -o binary -S elf_file bin_file
  • arm-linux-objdump 常用来显示二进制文本信息,本书中常用来查看反汇编代码

    1.将ELF格式的文件转换为反汇编文件:

arm-linux-objdump -D elf_file > dis_file

2.将二进制文件转换为反汇编文件:

arm-linux-objdump -D -b binary -m arm bin_file > dis_file

猜你喜欢

转载自blog.csdn.net/andrewgithub/article/details/80862406