<commit_before>---
layout: post
title: Cross compile GDB 
categories: [Cross compile, embedded tools, technic]
tags: [IOT, Anlysis]
description: To debug the file under mips device more convenience, tryed many ways, and finaly sucessed.
---


#交叉编译各平台下GDB

　　所谓的交叉编译，就是：在一种平台上编译，编译出来的程序，是放到别的平台上运行即编译的环境，和运行的环境，不一样，属于交叉的，此所谓cross compile。交叉编译，这个概念，主要和嵌入式开发有关。  
　　之所以要有交叉编译，主要原因是：嵌入式系统中的资源太少。具体的解释就是：交叉编译出来的程序，所要运行的目标环境中，各种资源，都相对有限，所以很难进行直接的本地编译。最常见的情况是：在进行嵌入式开发时，目标平台，即嵌入式开发板，比如是最大主频200MHz的ARM的CPU，加上32M的RAM，加上1G的Nand Flash等等。
　　在如此相对比较紧张的硬件资源的前提下，在已经运行了嵌入式Linux的前提下，是没法很方便的，直接在嵌入式Linux下，去本地编译，去在ARM的CPU下，编译出来，供ARM的CPU可以运行的程序的。  
　　因为编译，开发，都需要相对比较多的CPU，内存，硬盘等资源，而嵌入式开发上的那点资源，只够嵌入式（Linux）系统运行的，没太多剩余的资源，供你本地编译。  
　　为什么要编译GDB呢？为了方便在嵌入式设备上直接调试、分析程序。（同tcpdump）  
　　网上对于如何构建交叉编译环境、如何一步步编译有很多文章。但，这些文章都是零散的、琐碎的、而且是不会出现其他问题的。本文主要记录笔者在搭建交叉编译环境以及对各平台下gdb进行编译的问题和解决方法。  
　　本文最后会将编译好的一些平台下的工具的binary文件分享出来。  


##搭建交叉编译的环境
　　其实整个交叉编译环境的搭建就是编译好了能编译出特定平台下的gcc、ar、as等工具。比如我想搭建能交叉编译mips平台下程序的环境，我最终需要用到mipsel-linux-gcc等。所以，这个过程，我们是需要先编译出对应平台的gcc等工具。  
　　先说下我本机环境吧，系统是BackBox（基于ubuntu14.04）：  


{% highlight sh %}
{% raw %}
tracy@Tracker:~$ uname -a  
Linux Tracker 3.13.0-63-generic #103-Ubuntu SMP Fri Aug 14 21:42:59 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux  
tracy@Tracker:~$ cat /proc/version  
Linux version 3.13.0-63-generic (buildd@lgw01-18) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #103-Ubuntu SMP Fri Aug 14 21:42:59 UTC 2015  
{% endraw %}
{% endhighlight %}
 
　　1. 先安装需要安装的东西，包括： build-essential bison flex 之类，通过下面命令可以安装好：   

{% highlight sh %}
sudo apt-get install build-essential bison flex  
{% endhighlight %}

　　2. 交叉编译环境搭建工具我用的是buildroot。   

{% highlight sh %}

#下载  
wget http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2  
#解压  
bzip2 -d buildroot-snapshot.tar.bz2  
tar -vxf buildroot-snapshot.tar  
{% endhighlight %}

　　这样我们得到了一个buildroot的文件夹。  
　　3.接下来就是设置交叉编译的环境了。  


{% highlight sh %}
tracy@Tracker:~$ cd buildroot  
tracy@Tracker:~$ make menuconfig  
{% endhighlight %}

　　得到如下界面：  
![Alt](https://github.com/purpleroc/purpleroc.github.io/blob/master/pic/buildroot.png?raw=true)  
　　这里主要设置两个地方。先进去第一个选项（以mips32小端模式为例进行演示）：   
![Alt text](https://github.com/purpleroc/purpleroc.github.io/blob/master/pic/mips.png?raw=true)  

> Target Architecture: 目标平台，可选项很多，这里选MIPS(little endian)。（PS：一定注意不要错，我就在这里错了次，然后～～大小端问题折腾了好久。）  
> 后面的可以不要动，有兴趣也可以看看每个选项是干嘛的。  

　　再进去第三个选项如下，这里需要注意的就是Kernel Header这里（PS：踩过坑的）：  
![Alt text](https://github.com/purpleroc/purpleroc.github.io/blob/master/pic/toolchain.png?raw=true)
> Kernel Headers：这里，先进去找找，看看有没有对应你本机系统内核版本的。怎么看本机系统内核？翻到文章最前面去。我的版本是Linux version 3.13.0-63-generic，然而，选项里面并没有3.13之类，于是选择手动设置，然后在后面的linux version这一栏里手动填写3.13。
> Custom kernel headers series：这里，大家就去找自己对应的版本就好了。再后面，我没改动过了。同上，有兴趣可以自行测试。

　　设置好这两个地方后，就保存，然后退出。之后，原地make一下。然后就是漫长的等待，因为buildroot会根据你设置的选项，去下载相应的文件进行编译。大概，一个小时的样子吧，就全部结束了。  
　　结束后，你能看到下面文件夹及内容，就代表环境搭建成功了。  


{% highlight sh %}
~tracy@Tracker:~$/buildroot# ls output/host/usr/bin/ -l
-rwxr-xr-x 1 root root   24763  9月  7 00:23 faked<commit_msg>fixed<commit_after>---
layout: post
title: Cross compile GDB 
categories: [Cross compile, embedded tools, technic]
tags: [IOT, Anlysis]
description: To debug the file under mips device more convenience, tryed many ways, and finaly sucessed.
---


#交叉编译各平台下GDB

　　所谓的交叉编译，就是：在一种平台上编译，编译出来的程序，是放到别的平台上运行即编译的环境，和运行的环境，不一样，属于交叉的，此所谓cross compile。交叉编译，这个概念，主要和嵌入式开发有关。  
　　之所以要有交叉编译，主要原因是：嵌入式系统中的资源太少。具体的解释就是：交叉编译出来的程序，所要运行的目标环境中，各种资源，都相对有限，所以很难进行直接的本地编译。最常见的情况是：在进行嵌入式开发时，目标平台，即嵌入式开发板，比如是最大主频200MHz的ARM的CPU，加上32M的RAM，加上1G的Nand Flash等等。
　　在如此相对比较紧张的硬件资源的前提下，在已经运行了嵌入式Linux的前提下，是没法很方便的，直接在嵌入式Linux下，去本地编译，去在ARM的CPU下，编译出来，供ARM的CPU可以运行的程序的。  
　　因为编译，开发，都需要相对比较多的CPU，内存，硬盘等资源，而嵌入式开发上的那点资源，只够嵌入式（Linux）系统运行的，没太多剩余的资源，供你本地编译。  
　　为什么要编译GDB呢？为了方便在嵌入式设备上直接调试、分析程序。（同tcpdump）  
　　网上对于如何构建交叉编译环境、如何一步步编译有很多文章。但，这些文章都是零散的、琐碎的、而且是不会出现其他问题的。本文主要记录笔者在搭建交叉编译环境以及对各平台下gdb进行编译的问题和解决方法。  
　　本文最后会将编译好的一些平台下的工具的binary文件分享出来。  


##搭建交叉编译的环境
　　其实整个交叉编译环境的搭建就是编译好了能编译出特定平台下的gcc、ar、as等工具。比如我想搭建能交叉编译mips平台下程序的环境，我最终需要用到mipsel-linux-gcc等。所以，这个过程，我们是需要先编译出对应平台的gcc等工具。  
　　先说下我本机环境吧，系统是BackBox（基于ubuntu14.04）：  


{% highlight sh %}
{% raw %}
tracy@Tracker:~$ uname -a  
Linux Tracker 3.13.0-63-generic #103-Ubuntu SMP Fri Aug 14 21:42:59 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux  
tracy@Tracker:~$ cat /proc/version  
Linux version 3.13.0-63-generic (buildd@lgw01-18) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #103-Ubuntu SMP Fri Aug 14 21:42:59 UTC 2015  
{% endraw %}
{% endhighlight %}
 
　　1. 先安装需要安装的东西，包括： build-essential bison flex 之类，通过下面命令可以安装好：   

{% highlight sh %}
sudo apt-get install build-essential bison flex  
{% endhighlight %}

　　2. 交叉编译环境搭建工具我用的是buildroot。   

{% highlight sh %}

#下载  
wget http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2  
#解压  
bzip2 -d buildroot-snapshot.tar.bz2  
tar -vxf buildroot-snapshot.tar  
{% endhighlight %}

　　这样我们得到了一个buildroot的文件夹。  
　　3.接下来就是设置交叉编译的环境了。  


{% highlight sh %}
tracy@Tracker:~$ cd buildroot  
tracy@Tracker:~$ make menuconfig  
{% endhighlight %}

　　得到如下界面：  
![Alt](https://github.com/purpleroc/purpleroc.github.io/blob/master/pic/buildroot.png?raw=true)  
　　这里主要设置两个地方。先进去第一个选项（以mips32小端模式为例进行演示）：   
![Alt text](https://github.com/purpleroc/purpleroc.github.io/blob/master/pic/mips.png?raw=true)  

> Target Architecture: 目标平台，可选项很多，这里选MIPS(little endian)。（PS：一定注意不要错，我就在这里错了次，然后～～大小端问题折腾了好久。）  
> 后面的可以不要动，有兴趣也可以看看每个选项是干嘛的。  

　　再进去第三个选项如下，这里需要注意的就是Kernel Header这里（PS：踩过坑的）：  
![Alt text](https://github.com/purpleroc/purpleroc.github.io/blob/master/pic/toolchain.png?raw=true)  

> Kernel Headers：这里，先进去找找，看看有没有对应你本机系统内核版本的。怎么看本机系统内核？翻到文章最前面去。我的版本是Linux version 3.13.0-63-generic，然而，选项里面并没有3.13之类，于是选择手动设置，然后在后面的linux version这一栏里手动填写3.13。  
> Custom kernel headers series：这里，大家就去找自己对应的版本就好了。再后面，我没改动过了。同上，有兴趣可以自行测试。

　　设置好这两个地方后，就保存，然后退出。之后，原地make一下。然后就是漫长的等待，因为buildroot会根据你设置的选项，去下载相应的文件进行编译。大概，一个小时的样子吧，就全部结束了。  
　　结束后，你能看到下面文件夹及内容，就代表环境搭建成功了。  


{% highlight sh %}
~tracy@Tracker:~$/buildroot# ls output/host/usr/bin/ -l
-rwxr-xr-x 1 root root   24763  9月  7 00:23 faked
{'fraction_non_alphanumeric': 0.12178752660009821, 'fraction_numerical': 0.03568505483712555, 'mean_word_length': 6.022988505747127, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 11, 'https://': 6, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4991561', 'n_tokens_mistral': 4018, 'n_tokens_neox': 4259, 'n_words': 337}