交叉编译是相对于本地编译来说的,最开始学习 C/C++时,在PC上写程序,编译生成可执行文件,最后在PC上运行。程序的编辑、编译、运行,都在一台PC电脑上。
嵌入式系统使用的芯片性能都比较弱,不能像X86一样运行Windows/Ubuntu系统,无法提供一个在开发板上写代码、编译代码的环境。
当接触嵌入式开发后,在PC上写程序,编译出可执行文件,最后可执行文件需要下载到开发板上运行。程序运行环境变了,如开发板是基于ARM。程序在X86上编辑,编译,最终运行在另一个和X86完全不同的架构的ARM芯片上。
X86、ARM、MIPS、RISC-V 等芯片的指令集是由不同的组织或者公司设计的,彼此并不兼容。要在 X86 的PC上编译出能够在 ARM上运行的程序,须明确告诉编译器,编译生成的可执行文件需要以ARM指令集的标准编码。为了流程变得简单,开发者们为不同的芯片开发了不同的编译器,如针对 ARM平台的 arm-linux-gcc,针对mips平台的 mips-linux-gnu-gcc。
gdbserver
gdb与gdbserver 的使用。可以像在本地调试一样,对远程机器上的程序进行调试。
嵌入式Linux的gdb调试环境由Host和Target两部分组成。Host端使用gdb,Target端使用gdbserver。
应用程序在嵌入式目标系统上运行,调试时,gdb调试在Host端。gdb向开发板上的gdbserver发出命令,而开发板上的gdbserver就会向应用程序发出信号,使应用程序停下来。
Linux发行版中有一个可以运行的gdb,但不能直接用来做远程调试,需要获取gdb的源代码包,针对arm平台作一个简单配置,重新编译得到相应gdb。
Target端:
远程调试时,需要在远程使用 gdbserver 打开要调试的程序。
有两种方式:
1.直接用 gdbserver 打开
gdbserver :1234 a.out
使用 gdbserver 运行程序 a.out, gdbserver 的监听地址为 192.168.1.230:1234
2.attach 到已经在执行的进程上
gdbserver --attach localhost:1234 16924
用 attach 的方式打开 gdbserver,调试进程号为 16924 的程序
Host端:
(gdb) target remote 192.168.1.230:1234
Remote debugging using 192.168.1.230:1234
0x400007c0 in ?? ()
(gdb) file a.out