lua-arm平台交叉编译

本文记录了作者在Ubuntu 16.04环境下,使用gcc-arm-linux-gnueabi交叉编译lua到ARM i386平台的过程。涉及步骤包括安装交叉编译工具,处理lua对libreadline的依赖,修改Makefile,以及解决静态库编译问题。重点讨论了段错误的可能原因和排查方法。

本文只记录写者如何进行交叉编译的,非教程或科普性文章,只用于记录,不建议大家阅读,因此设置为收费文章。
简单来讲修改MakeFile编译工具直接make就行,需要注意的就是lua依赖libreadline库

平台: virtual box: Ubuntu 16.04 amd-x64
目标: 生成arm i386的包

1. 首先下载交叉编译包

执行如下命令:

sudo apt-get install gcc-arm-linux-gnueabi
可以通过下述指令查看版本

arm-linux-guneabi-gcc -v
在这里插入图片描述

2. readline

src/MakeFile ln122-ln126


Linux linux:	linux-noreadline

linux-noreadline:
	$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl"

linux-readline:
	$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE" SYSLIBS="-Wl,-E -ldl -lreadline"

可发现linux分了两类,一类是readline,一类是noreadline。默认是noreadline。
所以你可以有两种做法(看你需求):

  • 第一种:下载readline源码,交叉编译readline源码,编译readline版本
  • 第二种:删除该部分(该部分比较简单,下面的可以直接跳过看第三章)

2.1 readline下载及编译

readline() 的参数是一个字符串,调用函数的时候会在屏幕上输出,这个函数会读取一行输入,然后返回一个指向输入字符串的指针,readline 会为输入的字符串动态分配内存,所以使用完之后需要free掉。

可以点击这里获取readline的资料

readline源码下载

readline有configure可以直接运行configure后 make

./configure --host=arm    --libdir=/usr/local/lib --includedir=/usr/local/include
#host是目标架构,按个人需求配置
#libdir是库文件的安装目录
#includedir是头文件的安装目录

2. lua交叉编译

lua交叉编译的话需修改MakeFile

lua源码路径下的MaleFile有两个,外层的可以设置一些参数,这些参数的都是由英文注释的比较简单,可以不用修改。

src/MakeFile路径下的MakeFile修改:
只需要将编译工具替换即可 arm-linux-gnueabi-gcc,执行运行make linux
在这里插入图片描述

make linux如果失败,就使用linux-noreadline,
问题原因:看第二章,是否默认是linux-noreadline

明天检查一下生成的是否正确

3. 关于生成的静态包

在开发过程中呢,引用第三方库,经常会发生莫名其妙的段错误,尤其是嵌入式开发,更更更尤其是你使用的是github上的开源代码/库。
这类错误一般上报的是:
signal SIGSEGV:page fault等等,该问题也会有其他的解决方法,一般先在win32上调试,win32如果都过不了,你大概是犯了以下三种错误:
(1)官方说法是:
SIGSEGV — Segment Fault. The possible cases of your encountering this error are:

1.buffer overflow — usually caused by a pointer reference out of range.

2.stack overflow — please keep in mind that the default stack size is 8192K.

3.illegal file access — file operations are forbidden on our judge system.

倘若已经确认不存在上述问题,但是还是报段错误。而且呢,这个段错误往往是在不同库切换的时候触发,打个比方:
liblib1.so链接了liblib2.a(linux包,so动态库,a静态库)。
段错误发生在函数func(classA*,classB*,classC*)//

funcchild(classA*,classB*,classC*);//调用liblib2.a

单步调试会发现进入func时实参三个指针都很正常,但是进入funcchild的后会有某个或者某几个指针变为了空。

在尝试一下,你将funcchild函数源码贴在func函数内部,函数正常运行。

在这里就可以确认第三方库包编译有问题

解决问题思路:
对比第三库包MakeFile和你自己项目的编译参数,统一编译参数。
一般情况下只是编译优化的问题 -O0等。

4.生成静态库

静态库生成可以用gcc,也可以用ar。
如果第三方库的源码存在问题,建议可以自己手动生成静态库。
ar rcu mylib.a file1.o file2.o
ar指令是一个压缩指令,静态库包的生成比较简单,就是一群.o文件的合集。

.o文件,即目标文件。一般通过.c或者.cpp文件编译而来,相当于VC编译出来的obj文件,可以用gcc -c指令生成。

C/C++程序编译的过程
扩展一下编译过程:
预处理,展开头文件,宏定义,条件编译处理等。通过gcc -E source.c -o source.i或者cpp source.c生成。
编译。这里是一个狭义的编译意义,指的是将预处理后的文件翻译成汇编代码的过程。通过gcc -S source.i生成。默认生成source.s文件。
汇编。汇编即将上一步生成的汇编代码翻译成对应的二进制机器码的过程。通过gcc -c source.s来生成source.o文件。
链接。链接是将生成目标文件和其引用的各种符号等生成一个完整的可执行程序的过程。链接的时候会进行虚拟内存的重定向操作。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoomCon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值