当前位置: 首页 > Linux

交叉编译GDB工具链

时间:2023-04-06 19:13:27 Linux

1。交叉编译交叉编译是指在一个平台上编译一个程序在另一个平台上运行。这里的平台涉及硬件和软件两部分。硬件平台是指CPU架构,软件平台是指操作系统。交叉编译主要针对嵌入式领域,由于嵌入式系统资源有限,没有办法在嵌入式平台上跑一套编译环境,所以需要借助其他平台的交叉编译工具链更强大的性能来制作在平台上运行的程序。交叉编译的基本步骤与普通编译相同:[1]configure在编译前进行配置。如果--host参数与--build参数不同,则为交叉编译。否则就是正常编译。[2]make编译。根据上一步configure配置生成的参数,调用相应的编译工具链编译生成目标程序。[3]makeinstall安装。将make生成的目标程序安装到指定目录。如果不运行makeinstall,可以手动复制到指定目录。1.1--build--host--target查看configure步骤中--build、--host和--target这三个参数的定义,在gdb中运行'./configure--help'./configure源目录--helpSystemtypes:--build=BUILD配置用于构建BUILD[猜测]--host=HOST交叉编译以构建程序以在HOST[BUILD]上运行--target=TARGET配置用于为TARGET[构建编译器HOST]sourcecode编译生成可执行程序。根据执行编译操作的平台、可执行程序的运行平台、可执行程序的处理平台,编译操作可以分为多种类型,对应的三个配置参数如下:--build:platformforrunningthecompilationtoolchain,即编译操作执行的平台。如果不指定该参数,则由config.guess进行猜测。通常不指定此参数。--host:可执行文件将运行的平台。如果未指定此参数,则与--build相同。如果--host和--build不同,则为交叉编译;否则为正常编译。--target:可执行文件的目标平台。如果未指定此参数,则与--host相同。一般来说,程序运行在什么平台上,就是在和什么平台打交道。该参数的值与--host参数相同,无需显式指定,因此通常不关注该参数。但在制作交叉编译工具(如gcc、gdb等)的特殊情况下,该值与--host不同,如交叉编译器arm-linux-gcc,运行在x86-linux上平台(--host参数),但处理arm-linux平台(--target参数)。如果是交叉编译一个普通的应用程序,比如运行在arm-linux平台上的tftp程序,其运行平台和处理平台都是arm-linux平台。1.2三种编译类型编译类型分为三种,主要体现在configure阶段配置参数的不同:(假设交叉编译工具链安装在x86-linux平台,目标嵌入式平台为编译的是arm-linux平台,这里只是为了说明目的,平台命名并不严格)[1]编译PC平台通用程序,一般执行如下形式的配置命令:./configure补全默认参数,其实相当于下面的命令:./configure--build=x86_linux--host=x86_linux--target=x86_linux[2]编译交叉编译工具链交叉编译工具链的特殊之处在于它运行在x86-linux平台上,但处理arm-linux平台。制作交叉编译工具链不需要使用交叉编译。一般执行如下形式的配置命令:./configure--target=arm_linux完成默认参数,实际上相当于如下命令:./configure--build=x86_linux--host=x86_linux--target=arm_linux[3]Cross-compileembeddedplatformprograms生成嵌入式平台程序需要使用交叉编译。一般执行如下形式的配置命令:./configure--host=arm_linuxCC=arm-linux-gcc完成默认参数,实际上相当于如下命令:./configure--build=x86_linux--host=arm_linux--target=arm_linuxCC=arm-linux-gcc其实如果我们要让编译工具运行在嵌入式平台上(如gcc、gdb等),也可以先执行上面的configure命令,然后执行make,但是生成的gcc、gdb等工具在目标嵌入式平台上基本不能正常运行,因为硬件不能动,所以嵌入式平台的编译工具链改为按照[2]中的方法制作[3]中的方法的make。2、GDB交叉编译及使用示例在嵌入式平台中使用GDB时,会用到GDB的远程(remote)调试方式:在目标板上通过gdbserver运行要调试的程序,在上位机上运行gdb并通过'targetremote[ip]:[port]'连接到目标板上的gdbserver,开始远程调试。在上位机上输入各种调试命令,在目标板上显示程序执行效果(包括打印),易于理解,因为被调试的程序本来就是在目标板上运行的。之所以没有在目标板上直接运行gdb进行调试,是因为目标板硬件配置低,无法运行gdb。当然,也不排除某些嵌入式平台性能强,可以正常运行gdb。当嵌入式平台的硬件越来越强大时,嵌入式平台与通用计算机平台的界限也越来越模糊。这是实际情况。在这种发展形势下,嵌入式技术的没落是必然的结果。嵌入式平台下搭建gdb调试环境,对于理解前面交叉编译过程中的--build、--host、--target这三个参数很有帮助。2.1环境描述虚拟机:CPU:x86_64,系统:openSUSELeap42.3,IP:192.168.202.240开发板:CPU:mipsmt7688,系统:openwrtlinux,IP:192.168.202.141虚拟机安装的C交叉编译器为mipsel-openwrt-linux-gcc,即交叉编译工具链的前缀为mipsel-openwrt-linux。2.2下载源代码从ftp://ftp.gnu.org/gnu/gdb下载最新版本的源代码gdb-8.2.tar.gz,解压:[1]tarzxvf./gdb-8.2.tar。gz[2]cdgdb-8.22.3编译gdb编译gdb:[1]cdgdb-8.2[2]./configure--target=mipsel-openwrt-linux[3]makegdb运行在虚拟机上,所以不需要交叉编译。--build和--host参数留空,实际使用虚拟机的平台参数。gdb虽然运行在虚拟机上,但处理的是开发板平台上的程序,所以指定--target为mipsel-openwrt-linux,值为交叉编译工具链前缀。2.4交叉编译gdbserver编译gdbserver:[1]cdgdb-8.2/gdb/gdbserver[2]./configure--host=mipsel-openwrt-linuxCC=mipsel-openwrt-linux-gcc[3]makegdbserver在开发上运行board,所以需要交叉编译。--build参数留空,实际使用虚拟机的platform参数。--host参数指定虚拟机平台,值为mipsel-openwrt-linux。--target参数留空,因此它的值将等于--host参数值。2.5远程使用gdb开发板:开发板的IP为192.168.202.141,可以输入以下任一命令gdbserver:1234testgdbserver127.0.0.1:1234testgdbserver192.168.202.141:1234testhost:firstinSHELL命令行运行gdb应用程序./gdb运行完前面的命令后,SHELL会进入gdb模式,'(gdb)'是下面指令中的提示符:(gdb)targetremote192.168.202.141(gdb)bmain.c:55(gdb)c上面第一条命令是远程连接开发板上的gdbserver。连接后就可以正常使用了。第二个命令是设置断点。第三条命令是运行程序。注意要调试的程序实际上已经在开发板上运行了,所以应该使用'c'命令而不是'r'命令。如果输入'r'命令,可以看到提示remoteThemodedoesnotsupportthe'r'command:(gdb)rThe"remote"targetdoesnotsupport"run"。尝试“帮助目标”或“继续”。3.遗留问题在交叉编译过程中,交叉编译工具链的前缀一般用作--host和--target的值;--build参数一般不指定,编译时自动猜测。这些都是实用层面的。一般即使出错,多试几次也能最终编译通过。至于平台描述的定义,也就是--build、--host和--target取值的具体取值规则,我没有找到官方的出处和定义。是的,我没有在网上找到它。4.参考文献GDBDebuggingEnvironmentforEmbeddedLinuxEstablishingPythonException异常信息QTRemoteDebuggingPythonProblemsinARMBoard5.修改记录2019-04-11第一稿