编译准备
源码
- 依赖项 expat 库的源码:https://github.com/libexpat/libexpat/releases/ (我选择最新 2.2.10 版本)
- gdb 源码:https://ftp.gnu.org/gnu/gdb/ (我选择 10.1 版本)
- [备用下载] gdb 源码:http://sourceware.org/pub/gdb/releases/
编译器
- 编译器 gcc
- 交叉编译器 arm-linux-gnueabihf-gcc
Linux 平台下 for linux 的编译
编译依赖的 expat 库
-
解压 tar 包
1
tar -vxf expat-2.2.10.tar.gz
-
进入解压后目录,并进行配置
host 体系怎么写?会根据 host 自动选择编译器为 your-host-gcc 系(注意需要能通过环境变量找到它);
ldd /usr/bin/bash
命令的结果中有一条libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
,其中 x86_64-linux-gnu 就是当前体系;1
./configure --host=x86_64-linux-gnu --prefix=$PWD/_install
-
编译和安装
1
make && make install
最终生成 libexpat.a;
编译 gdb
-
安装工具
没有 texinfo 编译会报错 “makeinfo: not found”
1
sudo apt-get install texinfo
-
解压 tar 包
1
tar -vxf gdb-10.1.tar.gz
-
进入解压后目录,并进行配置
host 体系会自动选择编译器(注意需要能通过环境变量找到它),target 体系为远程调试的目标体系;
--disable-werror
的意思是让警告不作为错误提示;1 2
./configure --host=x86_64-linux-gnu --target=x86_64-linux-gnu --prefix=$PWD/_output --disable-werror\ --with-expat --includedir=$HOME/public/expat-2.2.10/_install/include --libdir=$HOME/public/expat-2.2.10/_install/lib
-
编译和安装
1
make && make install
最终生成 x86_64 目标文件:gdb
;
Linux 平台下 for armhf 的编译
编译依赖的 expat 库
-
解压 tar 包
1
tar -vxf expat-2.2.10.tar.gz
-
进入解压后目录,并进行配置
host 体系怎么写?会根据 host 自动选择编译器为 your-host-gcc 系(注意需要能通过环境变量找到它);
ldd /usr/bin/bash
命令的结果中有一条libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
,其中 x86_64-linux-gnu 就是当前体系;1
./configure --host=x86_64-linux-gnu --prefix=$PWD/_install
-
编译和安装
1
make && make install
最终生成 libexpat.a;
编译 gdb
-
安装工具
没有 texinfo 编译会报错 “makeinfo: not found”
1
sudo apt-get install texinfo
-
解压 tar 包
1
tar -vxf gdb-10.1.tar.gz
-
进入解压后目录,并进行配置
host 体系会自动选择编译器(注意需要能通过环境变量找到它),target 体系为远程调试的目标体系;
--disable-werror
的意思是让警告不作为错误提示;1 2
./configure --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --prefix=$PWD/_output --disable-werror\ --with-expat --includedir=$HOME/public/expat-2.2.10/_install/include --libdir=$HOME/public/expat-2.2.10/_install/lib
-
编译和安装
1
make && make install
最终生成 x86_64 目标文件:arm-linux-gnueabihf-gdb
;
armhf 平台下 for armhf 的编译
编译依赖的 expat 库
-
解压 tar 包
1
tar -vxf expat-2.2.10.tar.gz
-
进入解压后目录,并进行配置
host 体系怎么写?会根据 host 自动选择编译器为 your-host-gcc 系(注意需要能通过环境变量找到它);
1
./configure --host=arm-linux-gnueabihf --prefix=$PWD/_install
-
编译和安装
1
make && make install
最终生成 libexpat.a;
编译 gdb
-
安装工具
没有 texinfo 编译会报错 “makeinfo: not found”
1
sudo apt-get install texinfo
-
解压 tar 包
1
tar -vxf gdb-10.1.tar.gz
-
进入解压后目录,并进行配置
host 体系会自动选择编译器(注意需要能通过环境变量找到它),target 体系为远程调试的目标体系;
--disable-werror
的意思是让警告不作为错误提示;1 2
./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --prefix=$PWD/_output --disable-werror\ --with-expat --includedir=$HOME/public/expat-2.2.10/_install/include --libdir=$HOME/public/expat-2.2.10/_install/lib
-
编译和安装
1
make && make install
最终生成 arm 目标文件:gdb
;
关于 ulimit
ulimit 用于限制 shell 启动进程所占用的资源,不同参数是不同的种类的资源;
默认限制
默认不允许产生 core 文件;
允许产生 coredump 文件
以下可临时解除限制,只在一个 shell 中生效;
永久生效可添加到
/etc/profile
末尾;
1
ulimit -c unlimited
进行测试
建议操作
- 将动态库拷贝到
/usr/lib
下,这样就不用export LD_LIBRARY_PATH=xxx
了; - gdb 拷贝到
/usr/bin
下;
产生一个 coredump
-
解除 core 文件限制
1
ulimit -c unlimited
-
编写段错误程序 test.c
1 2 3 4 5 6 7 8 9 10
#include <stdio.h> int main(int argc, char *argv[]) { char *a = 0; printf("222222\n"); *a = 8; printf("333333\n"); return 0; }
-
编译 main.c
1
gcc -g test.c -o test
-
运行程序,产生 core
/proc/sys/kernel/core_pattern
可以设置格式化的 core 文件保存位置或文件名;1 2 3
➜ ~ ./test 222222 [1] 13365 segmentation fault ./test
-
使用 gdb 调试段错误程序 + core 文件
执行后会立刻定位到段错误发生行,也可在 gdb 环境中输入 where 进行定位;
1
gdb test core