armlinux驱动编译方法
1
gcc
-g
test_gdb.c
-o
test_gdb
只有加入选项-g才能被gdb调试。
使用quit命令,输入:
quit
即可。
list:显示10源代码,再次输入该命令显示接下来的10行。
list1,10:显示从第一行到第10行的代码。
在gdb中最简单的设置方式是:break
行号
在这一行设置断点。比如break9
会在代码的第9行设置断点。当程序执行到第9行会自动暂停,此时,第9行代码还未执行。
你也可以使用:break
函数名
的方式在某个函数处设置断点,程序运行到这个函数内的第一条语句处会自动暂停。
使用命令:clear
行号
即可删除。
两种命令:next和step。两者均可以一句一句的查看语句。但不同的是,next命令将函数调用看作一条语句,而step则会进入函数,一步步的执行函数内的代码。
输入命令:continue。它可以让程序继续运行,直到程序运行完毕或者遇到下一个断点为止。
11.当程序在断点处暂停执行时,如何查看当前变量的值?
使用print命令。
这时我总结的linux
gdb,希望对你有帮助
② 如何编译armlinux的go
Golang也就是Go语言,现在已经发行到1.4.1版本了,语言特性优越性和背后Google强大靠山什么的就不多说了。Golang的官方提供了多个平台上的二进制安装包,遗憾的是并非没有发布ARM平台的二进制安装包。ARM平台没办法直接从官网下载二进制安装包来安装,好在Golang是支持多平台并且开源的语言,因此可以通过直接在ARM平台上编译源代码来安装。整个过程主要包括编译工具配置、获取Golang源代码、设置Golang编译环境变量、编译、配置Golang行环境变量等步骤。
注:本文选用树莓派做测试,因为树莓派是基于ARM平台的。
1、编译工具配置
据说下个版本的golang编译工具要使用golang自己来写,但目前还是使用C编译工具的。因此,首先要配置好C编译工具:
1.1在Ubuntu或Debian平台上可以使用sudoapt-getinstallgcclibc6-dev命令安装,树莓派的RaspBian系统是基于Debian修改的,所以可以使用这种方法安装。
1.2在RedHat或CentOS6平台上可以使用sudoyuminstallgcclibc-devel命令安装。
安装完成后可以输入gcc--version命令验证是否成功安装。
2、获取golang源代码
2.1直接从官网下载源代码压缩包。
golang官网提供golang的源代码压缩包,可以直接下载,最新的1.4.1版本源代码链接:/golang/go1.4.1.src.tar.gz
2.2使用git工具获取。
golang使用git版本管理工具,也可以使用git获取golang源代码。推荐使用这个方法,因为以后可以随时获取最新的golang源代码。
2.2.1首先确认ARM平台上已经安装了git工具,可以使用git--version命令确认。一般linux平台都安装了git,没有的话可以自行安装,不同平台的安装方法可以参考:download/linux
2.2.2克隆远程golang的git仓库到本地
在终端cd到你想要安装golang的目录,确保该目录下没有名为go的目录。然后以下命令获取代码仓库:
gitclone/go
大陆地区可能会获取失败,在不翻墙的情况下我试了几次都没成功,原因大家都懂的。好在google已经将golang也托管到github上面,所以也可以通过下面命令获取:
gitclone/golang/go.git
视网络情况,下载可能需要不少时间。我2M的带宽花了将近两个小时才下载完,虽然整个项目不过几十兆==
下载完成后,可以看到目录下多了一个go目录,里面即为golang的源代码,在终端上执行cdgo命令进入该目录。
执行下面命令检出go1.4.1版本的源代码,因为现在汪敏指已经有新的代码提交上去了,最新的代码可能不是最稳定的:
gitcheckoutgo1.4.1
至此,最新1.4.1发行版的源代码获取完毕
3、设置golang的编译环境变量
主要有GOROOT、GOOS、GOARCH、GOARM四个环境变量需要设置,先解释四个环境变量的意义。
3.1GOROOT
主要代表golang树结构目录的路径,也就是上面git检出的go目录。一般可以不用设置这个环境变量,因为编译的时候默认会以go目录下src子目录中的all.bash脚本困配运行时的父目录作为GOROOT的值。为了保险起见,可以直接设拿芹置为go目录的路径。
3.2GOOS和GOARCH
分别代表编译的目标系统和平台,可选值如下:
GOOSGOARCH
darwin386
darwinamd64
dragonfly386
dragonflyamd64
freebsd386
freebsdamd64
freebsdarm
linux386
linuxamd64
linuxarm
netbsd386
netbsdamd64
netbsdarm
openbsd386
openbsdamd64
plan9386
plan9amd64
solarisamd64
windows386
windowsamd64
需要注意的是这两个值代表的是目标系统和平台,而不是编译源代码的系统和平台。树莓派的RaspBian是linux系统,所以这些GOOS设置为linux,GOARCH设置为arm。
3.3GOARM
表示使用的浮点运算协处理器版本号,只对arm平台有用,可选值有5,6,7。如果是在目标平台上编译源代码,这个值可以不设置,它会自动判断需要使用哪一个版本。
总结下来,在树莓派上设置golang的编译环境变量,可编辑$HOME/.bashrc文件,在末尾添加下面内容:
exportGOROOT=你的go目录路径
exportGOOS=linux
exportGOARCH=arm
编辑完后保存,执行source~/.bashrc命令让修改生效。
4、编译源代码
环境变量配置完成自后就可以开始编译源代码。在go目录下的src子目录中,主要有all.bash和make.bash两个脚本(另外还有两个all.bat和make.bat脚本适用于window平台)。编译实际上就是执行其中一个脚本,两者的区别在于all.bash在编译完成后还会执行一些测试套件。如果希望只编译不测试,可以运行make.bash脚本。使用cd命令进入go下src目录,执行./all.bash或者./make.bash命令即可开始编译。由于硬件情况不同,编译耗费的时间不同。在我的B型树莓派编译过程花费了将近半个小时,编译完成后执行的测试套件又花费了差不多一个小时,总共花费了一个半小时左右。
5、配置golang运行环境变量
编译完成后,go目录下会生成bin目录,里面就是go的运行脚本。为了以后使用方法,可以将这个bin路径添加到PATH环境变量中。同样编辑~/.bashrc文件,因为前面设置过GOROOT环境变量指向go目录了,所以只需要在末尾加上
exportPATH=$PATH:$GOROOT/bin
保存后同样执行source~/.bashrc命令让环境变量生效。
至此,golang源代码编译安装成功。执行goversion应该就能看到当前golang的版本信息,表示编译安装成功。
③ 如何建立Linux下的ARM交叉编译环境
首先安装交叉编译器,网络“arm-linux-gcc”就可以一个编译器压缩包。
把压缩包放到linux系统中,解压,这样就算安装好了交叉编译器。
设置编译器环境变量,具体方式网络。如打开 /etc/bash.bashrc,添加刚才安装的编译器路径 export PATH=/home/。。。/4.4.3/bin:$PATH。这样是为了方便使用,用arm-linux-gcc即可,不然既要带全路径/home//bin/arm-linux-gcc,这样不方便使用。
编译c文件。和gcc编译相似,把gcc用arm-linu-gcc代替就是了。编译出来的就可以放到arm上运行了。</ol>
④ 如何编译可以在Windows下运行的带有python支持的ARM Linux GDB
做这件事情的目的是为了在QtCreator里调试ARM Linux程序的时候,能看清楚QString、QList这些Qt特有的对象的内容,而不是一个完全看不懂的结构体。
目前(2014年8月)Linaro、CodeSourcery的GCC工具链里的GDB都不支持Python。想知道你用的GDB支持不支持,试一试就行,这样表示不支持:
(gdb) python
>print 'Hello GDB!'
>(按Ctrl+D)Python scripting is not supported in this of GDB.
这样表示支持:
(gdb) python
>print 'Hello GDB!'
>(按Ctrl+D)Hello GDB!
这件事情乍一看也很简单,只要把GDB源码下载下来,然后再配置,打开Python支持就行了。实际上会遇到的问题是,在MinGW下,又要与“\”和“:”这两个Windows路径里的刺头斗争了。我觉得我之前挺傻,编译MinGW下Qt的时候,就去硬磕源码和configure脚本去了。这次GDB的configure是自动生成的,不是给人看的,configure.ac看起来也很费劲,根本磕不下去,于是我换了个思路,在ubuntu下交叉编译吧,sudo apt-get install mingw32,这是Ubuntu下的MinGW交叉编译器。
然后是依赖,这样的GDB要依赖expat和python的开发版本。如果是ubuntu底下直接编译,apt-cache search一下他们的开发版本,然后sudo apt-get install一下就好了;给MinGW交叉编译就麻烦了。先说expat,这个好办,把http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz下载下来,然后:
./configure --prefix=[安装目录,如/home/c/mingw-gdb/expat] --host=i586-mingw32msvc
make
make install
会提示一些警告,无视即可。
Python就无语了,目前的GDB貌似最高支持Python 2.7,而2.7版本的Python本身不支持MinGW…… 好在有高手做了Patch,也写了说明,可以参考这文章:http://mdqinc.com/blog/2011/10/cross-compiling-python-for-windows-with-mingw32/
但是,就算这样,编译也充满挑战,要修复很多问题,出来的Python还少“nt”模块。就在我觉得没办法的时候,突然发现Windows版Qt提供的MinGW居然内置了Python开发包,位置在Tools/mingw48_32/opt,赶紧把它拷贝到Linux下,比如/home/c/mingw-gdb/python。当然,你也必须确保ubuntu下有可用的python。
然后,给GDB打一个补丁:
--- gdb-7.8/gdb/configure 2014-07-29 20:37:42.000000000 +0800
+++ gdb-7.8-old/gdb/configure 2014-08-30 00:08:27.122042706 +0800
@@ -8263,21 +8263,22 @@
# We have a python program to use, but it may be too old.
# Don't flag an error for --with-python=auto (the default).
have_python_config=yes
- python_includes=`${python_prog} ${srcdir}/python/python-config.py --includes`
+ python_config_tool=`echo ${python_prog} | sed "s#python.exe#python-config#g"`
+ python_includes=`${python_config_tool} --includes`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
as_fn_error "failure running python-config --includes" "$LINENO" 5
fi
fi
- python_libs=`${python_prog} ${srcdir}/python/python-config.py --ldflags`
+ python_libs=`${python_config_tool} --ldflags`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
as_fn_error "failure running python-config --ldflags" "$LINENO" 5
fi
fi
- python_prefix=`${python_prog} ${srcdir}/python/python-config.py --exec-prefix`
+ python_prefix=`${python_config_tool} --exec-prefix`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
@@ -8343,12 +8344,12 @@
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+#if ac_fn_c_try_link "$LINENO"; then :
have_libpython=${version}
found_usable_python=yes
PYTHON_CPPFLAGS=$new_CPPFLAGS
PYTHON_LIBS=$new_LIBS
-fi
+#fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
CPPFLAGS=$save_CPPFLAGS
这个补丁的目的是强制为检测到python。
然后给拷贝到Linux下的python开发包打一个补丁:
--- python-old/bin/python-config 2013-04-18 02:43:01.000000000 +0800
+++ python/bin/python-config 2014-08-30 00:53:16.630060288 +0800
@@ -1,4 +1,4 @@
-#!/temp/x32-480-posix-dwarf-r2/mingw32/opt/bin/python2.7.exe
+#!/usr/bin/python
import sys
import os
@@ -31,26 +31,23 @@
for opt in opt_flags:
if opt == '--prefix':
- print sysconfig.PREFIX
+ print '../python'
elif opt == '--exec-prefix':
- print sysconfig.EXEC_PREFIX
+ print '../python'
elif opt in ('--includes', '--cflags'):
- flags = ['-I' + sysconfig.get_python_inc(),
- '-I' + sysconfig.get_python_inc(plat_specific=True)]
+ flags = ['-I' + os.path.split(os.path.realpath(__file__))[0] + '/../include/python2.7']
if opt == '--cflags':
- flags.extend(getvar('CFLAGS').split())
+ flags += ['-fno-strict-aliasing -DMS_WIN32 -DMS_WINDOWS -DHAVE_USABLE_WCHAR_T -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes']
print ' '.join(flags)
elif opt in ('--libs', '--ldflags'):
- libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
- libs.append('-lpython'+pyver)
+ libs = ['-lm -lpython2.7 -Wl,--out-implib=libpython2.7.dll.a']
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
# shared library in prefix/lib/.
if opt == '--ldflags':
if not getvar('Py_ENABLE_SHARED'):
- libs.insert(0, '-L' + getvar('LIBPL'))
- libs.extend(getvar('LINKFORSHARED').split())
+ libs.insert(0, '-L' + os.path.split(os.path.realpath(__file__))[0] + '/../lib/python2.7/config')
print ' '.join(libs)
因为Linux下是无法运行开发包中的python.exe的,所以这个补丁借用了ubuntu的python。里面的cflags和ldflags都是在Windows底下运行原始python-config获得的。prefix和exec-prefix设成“../python”,可以在编译完以后,把python开发包拷贝到gdb安装目录里面的python子目录,这样运行GDB的时候就不需要设定PYTHONHOME环境变量了。
最后一个事情,确保你的Linux下有arm交叉编译器,我的是arm-linux-gnueabihf,是啥target就写啥。
准备工作做完了,开始配置和编译:
./configure --with-expat --host=i586-mingw32msvc --target=arm-linux-gnueabihf --with-libexpat-prefix=[expat安装位置] --with-python=[python开发包安装位置/bin/python.exe]
make
make DESTDIR=[GDB安装位置] install
然后把GDB安装位置下面的所有文件拷贝到Windows下,再把python开发包拷贝到同目录下的python子目录,大功告成。
如果提示没找到libpython2.7.dll,那就把GDB安装目录的python/bin下的拷贝到bin下。
如果发现生成的exe文件太大了,那就strip一下。
2015年9月12日追加:
在windows下调试时,一般会提示说加载不了共享库,让你用"set sysroot"或"set solib-search-path"之类设定路径的。这个问题可以通过.gdbinit文件,用上面这两条命令来设定路径解决,如果想一劳永逸,可以在编译的时候加上host_configargs环境变量来解决这个问题:
host_configargs=--with-sysroot=E:\MinGW\opt\sysroot-arm ./configure ...
或者
export host_configargs=--with-sysroot=E:\MinGW\opt\sysroot-arm
./configure ...
后面的路径是放在windows下的sysroot的位置。
⑤ 如何编译ARM版本LINUX QT4.5
编译安装内核 下载并解压内核 解压内核:tar xf linux-2.6.XX.tar.xz 定制内核:make menuconfig 参见makefile menuconfig过程讲解 编译内核和模块:make 生成内核模块和vmlinuz,initrd.img,Symtem.map文件 安装内核和模块:sudo make moles_install install 复制模块文件到/lib/moles目录下、复制config,vmlinuz,initrd.img,Symtem.map文件到/boot目录、更新grub 其他命令: make mrprobe:命令的作用是在每次配置并重新编译内核前需要先执行“make mrproper”命令清理源代码树,包括过去曾经配置的内核配置文件“.config”都将被清除。即进行新的编译工作时将原来老的配置文件给删除到,以免影响新的内核编译。 make dep:生成内核功能间的依赖关系,为编译内核做好准备。 几个重要的Linux内核文件介绍 config 使用make menuconfig 生成的内核配置文件,决定将内核的各个功能系统编译进内核还是编译为模块还是不编译。 vmlinuz 和 vmlinux vmlinuz是可引导的、压缩的内核,“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制,Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。