背景
现场使用linux版本差异大,有些内核版本甚至只有2.x,直接部署程序会报kernel too old,网上虽然有一些其它解决方法,但是存在隐患且不能升级现场系统,为此,可以采用交叉编译工具,在高版本4.x kernel 编译低版本kernel ,让程序正常运行。为此需要制作交叉编译工具,选用了buildroot.
Buildroot 使用
在github上下载相应程序,自行搜索下载方式,这部分略过,我采用的是buildroot-2023.02.6这一版。这里只记录交叉编译链的制作过程。
下载完后,目录基本为
进入这个目录,执行 make menuconfig,出现
接下来依次配置。
Target options
我的目标机器架构也是x86_64的,因此这样选择
Toolchain
Toolchain type 选择Buildroot toolchain(自建编译链),不使用External toolchain;
C library 我选用了musl-libc,libc的区别请自行搜索;
配置Kernel Headers 为Manually specifed linux version(手动指定linux版本,因为这个版本太低了,其他的选项都是3.x);
手动输入linux version 为2.6.32;
Customer kernel header series 为2.6.x;
其他红箭头的选项按照需要设置,不算太多重要。
System configuration
System configuration 中需要禁用掉系统初始化选项和 /bin/sh:
Init system:选择 none。
/bin/sh :设置为 none。
其他保持默认。
Kernel
取消选择。
Target packages
Target packages 禁用 busybox。
busybox:选项设为空。
Filesystem images
禁用 tar the root filesystem。
其他的选项都不必设置,保存,退出即可。
执行make sdk,即可编译出交叉编译工具链,如果编译过程中存在下载某些资源失败的情况,可以根据下载失败的链接,用科学上网的方式下载,并把它拷贝在dl文件夹下。
工具链使用
交叉编译工具链在 ./output/images 目录下,
将其复制到任意目录并解压
示例源码
#include <stdio.h>
int main()
{
int a = 8;
a >> 4;
printf("test libc postion!\n");
printf("a = %d\n",a);
return 0;
}
交叉编译器gcc编译
/home/ubuntu/kernel2.26/x86_64-buildroot-linux-musl_sdk-buildroot/bin/x86_64-buildroot-linux-musl-gcc main.c -o main -static
生成main,拷贝到目标机器中运行
可以看到运行成功!
PS: 编译使用交叉编译工具链的linux架构
参考来源:https://www.cnblogs.com/kele-dad/p/13125808.html