【ELF 1开发板试用】3. Ubuntu 下开发环境搭建——编译
官方资料采用的是 Windows 下加虚拟机的方式搭建开发环境,笔者从官方资料中抽丝剥茧,把在 Ubuntu 实机上相关的资料整理出来。
必要库的安装
在进行开发之前,还需要一些其他的必要库,我们使用以下命令逐一安装,安装前需保证网络可正常使用,能上外网:
首先,更新下载源信息
sudo apt-get update
提供编译程序必须软件包列表信息
sudo apt-get install build-essential
用于生成基于文本的用户界面
sudo apt-get install libncurses*
基于 Lzo 库的压缩解压工具
sudo apt-get install lzop
网络配置工具
sudo apt-get install net-tools
Ubuntu 系统的主要目录
目录 |
说明 |
---|
/ |
根目录,所有的目录都是由根目录衍生出来 |
/bin |
系统的基本指令,可以被 root 和一般用户使用 |
/home |
用户主目录,默认用户的主文件夹都会放到这里 |
/dev |
设备文件目录,设备与接口设备都是以文件形式存在在该目录 |
/etc |
系统的主要配置文件目录 |
/lib |
系统函数库目录 |
/lib/moudle |
内核相关的模块驱动 |
/root |
系统管理员 root 的主文件夹 |
/usr |
Unix Software Resource 的缩写,系统的默认软件会放到该目录下 |
/usr/bin |
一些用户使用命令,非系统必须的命令 |
/usr/lib |
应用软件所需的库文件 |
/sbin |
重要的系统执行文件 |
/mnt |
用户临时挂载目录 |
/opt |
第三方软件放置目录 |
/proc |
该目录为虚拟文件系统,操作系统运行时,进程信息及内核信息(比如 cpu、硬盘分区、内存信息等)存放在这里,放置的数据都在内存中 |
TFTP服务搭建
TFTP(Trivial File Transfer Protocol,简单文件传输协议),是 TCP/IP 协议族中用 来在客户机和服务器之间进行简单文件传输的协议,开销很小。TFTP 通常用于内核调试。 在嵌入式 Linux 开发过程中,内核调试是其中一个基础、重要的环节。调试内核通常是与 Bootloader 配合使用,只需在 Bootloader 中实现了网卡驱动和 TFTP 客户端,就可以使用 TFTP 进行传输内核。使用 TFTP 协议传输文件,还需要在主机安装 TFTP 服务端,可以在 Linux 系统下实现,也可以在 Windows 系统下实现,下面在 Linux(Ubuntu)系统下安装 TF TP 服务端进行测试。
一、安装服务器、客户端和守护进程
sudo apt-get install tftp-hpa tftpd-hpa xinetd
二、服务器配置
首先,在 ~
目录下建一个 tftpboot
,并把属性改成任意用户可读写:
mkdir ~/tftpboot
chmod 777 ~/tftpboot
然后,进入目录 /etc/xinetd.d/,并在其中新建文件tftp,把指定的内容加入到tftp文件中:
cd /etc/xinetd.d/
sudo nano tftp
添加以下内容到tftp文件:
service tftp
{
disable = no 138
socket_type = dgram
protocol = udp
wait = yes
user = clark
server = /usr/sbin/in.tftpd
server_args = -s /home/clark/tftpboot -c
per_source = 11
cps = 100 2
}
最后,修改配置文件/etc/default/tftpd-hpa:
sudo nano /etc/default/tftpd-hpa
修改为:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/clark/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -l -c -s"
注意:将“TFTP_DIRECTORY” 改为新建tftpboot目录所在的路径。
三、重新启动服务
sudo /etc/init.d/xinetd reload
[ ok ] Reloading xinetd configuration (via systemctl): xinetd.service.
sudo /etc/init.d/xinetd restart
[ ok ] Restarting xinetd (via systemctl): xinetd.service.
sudo /etc/init.d/tftpd-hpa restart
[ ok ] Restarting tftpd-hpa (via systemctl):tftpd-hpa.service.
四、测试服务器
测试一下,在/tftpboot文件夹下新建立一个文件 :
touch abc
进入另外一个文件夹:
cd /home/
sudo tftp 192.168.124.20 //192.168.124.20 为本机 IP
tftp> get abc
tftp> quit
ls
abc clark
如果可以下载 abc
文件说明服务器已经安装成功
SSH 服务搭建
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组**(Network Working Group)**所制 定的建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务 提供安全性的协议,利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 最 初是 UNIX 系统上的一个程序,后来又迅速扩展到其他操作平台,目前为止,几乎所有 UNIX 平台,包括 HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix 等,都可运行。 因为就是在 Ubuntu 实机上编译了,也许会遇到开发板需要登录实机的情况,所以最好也把 SSH 一起安装了。
安装 SSH
安装 SSH 服务
sudo apt-get install ssh
启动 SSH 服务
sudo service ssh start
查看 SSH 服务的状态
sudo service ssh status
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: e>
Active: active (running) since Thu 2023-11-23 19:22:47 CST; 16s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 38936 (sshd)
Tasks: 1 (limit: 37869)
Memory: 1.7M
CPU: 45ms
CGroup: /system.slice/ssh.service
└─38936 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
11月 23 19:22:47 clark-Lenovo-XiaoXin-Air-14ARR systemd[1]: Starting OpenBSD Se>
11月 23 19:22:47 clark-Lenovo-XiaoXin-Air-14ARR sshd[38936]: Server listening o>
11月 23 19:22:47 clark-Lenovo-XiaoXin-Air-14ARR sshd[38936]: Server listening o>
11月 23 19:22:47 clark-Lenovo-XiaoXin-Air-14ARR systemd[1]: Started OpenBSD Sec>
关闭 SSH 服务
sudo service ssh stop
测试 SSH
测试非常简单,直接在终端执行
ssh localhost
遇到 Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入 yes
就可以了。
交叉编译
交叉编译是指在一个平台上生成可以在另一个平台上执行的代码。由于不同 的体系结构有不同的指令系统。因此,不同的 cpu 需要有相应的编译器,而交叉编 译就如同翻译一样,把相同的程序代码翻译成不同的 cpu 的对应的可执行的二进 制文件。
交叉编译链安装
提前下载好百度网盘客户端,前往官方资料下载 EF1 开发板资料包/06-常用工具/06-1 编译工具安装脚本/fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.0.sh
到 ~
路径下,给予执行权限
chmod +x fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.0.sh
接着执行
sudo ./fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.0.sh
连按两次回车,等待编译SDK安装完毕。
Freescale i.MX Release Distro SDK installer version 4.1.15-2.0.0
================================================================
Enter target directory for SDK (default: /opt/fsl-imx-x11/4.1.15-2.0.0):
You are about to install the SDK to "/opt/fsl-imx-x11/4.1.15-2.0.0". Proceed[Y/n]?
Extracting SDK...............................................................................................................................................................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
$ . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
设置环境变量
每次重开一个终端,都需要设置环境变量
. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
查看 gcc 版本
arm-poky-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-poky-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/lto-wrapper
Target: arm-poky-linux-gnueabi
Configured with: ../../../../../../work-shared/gcc-5.3.0-r0/gcc-5.3.0/configure --build=x86_64-linux --host=x86_64-pokysdk-linux --target=arm-poky-linux-gnueabi --prefix=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr --exec_prefix=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr --bindir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi --sbindir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi --libexecdir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi --datadir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/share --sysconfdir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/etc --sharedstatedir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/com --localstatedir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/var --libdir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/lib/arm-poky-linux-gnueabi --includedir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/include --oldincludedir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/include --infodir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/share/info --mandir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/share/man --disable-silent-rules --disable-dependency-tracking --with-libtool-sysroot=/home/diskc/home/liyue/poky/fsl-arm-yocto-bsp/build-fb/tmp/sysroots/x86_64-nativesdk-pokysdk-linux --with-gnu-ld --enable-shared --enable-languages=c,c++ --enable-threads=posix --enable-multilib --enable-c99 --enable-long-long --enable-symvers=gnu --enable-libstdcxx-pch --program-prefix=arm-poky-linux-gnueabi- --without-local-prefix --enable-lto --enable-libssp --enable-libitm --disable-bootstrap --disable-libmudflap --with-system-zlib --with-linker-hash-style=gnu --enable-linker-build-id --with-ppl=no --with-cloog=no --enable-checking=release --enable-cheaders=c_global --without-isl --with-gxx-include-dir=/not/exist/usr/include/c++/5.3.0 --with-build-time-tools=/home/diskc/home/liyue/poky/fsl-arm-yocto-bsp/build-fb/tmp/sysroots/x86_64-linux/usr/arm-poky-linux-gnueabi/bin --with-sysroot=/not/exist --with-build-sysroot=/home/diskc/home/liyue/poky/fsl-arm-yocto-bsp/build-fb/tmp/sysroots/imx6ulevk --enable-poison-system-directories --with-mpfr=/home/diskc/home/liyue/poky/fsl-arm-yocto-bsp/build-fb/tmp/sysroots/x86_64-nativesdk-pokysdk-linux --with-mpc=/home/diskc/home/liyue/poky/fsl-arm-yocto-bsp/build-fb/tmp/sysroots/x86_64-nativesdk-pokysdk-linux --enable-nls --with-arch=armv7-a
Thread model: posix
gcc version 5.3.0 (GCC)
最后看到 gcc version 5.3.0 (GCC)
说明安装成功了。
编译 helloworld
新建一个 hello.c
文件,内容是
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
设置环境变量之后,编译工具用 $CC
表示,所以执行
$CC hello.c -o hello
生成一个可执行文件 hello
。将编译好的可执行文件复制到开发板上执行,可得到输出 Hello, World!
。 如果将这个文件放在实机里执行就会报错 bash: ./hello: 无法执行二进制文件:可执行文件格式错误
,同样的代码,编译器不同,那生成的可执行文件也就不同了。执行
gcc hello.c -o hello1
对比两个可执行文件
file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=cfd361c10dcbc51b8d324bc1ef5db3423399a686, not stripped
file hello1
hello1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=a37c63bc9ce790c1d84a27b13e19f4c750e5cef2, for GNU/Linux 3.2.0, not stripped
可以看到,系统架构,位数,系统版本统统不一样,所以可执行文件也只能在对应得环境下运行。