突发奇想,看看能不能用gcc编译,于是安装了一个arm-linux-gnueabihf-gcc,尝试编译”applications/sample/camera/app”文件。
编译过程没有什么好说的,自然一次成功。把编译好的文件放在userdata文件夹下运行
当然是不能运行的。
我们再仔细研究一下elf文件的格式组成。
对于我们希望编译出来可以执行的elf,应该看右图“执行视图”。当我们使用./XXX命令执行一个可执行的elf文件时,动态链接器(即加载器)会以执行视图解析这个文件,对于这个文件来说,最重要的就是段表(即Segment)。
上述错误提示也是说表的地址错误了,使用readelf文件分别查看并比较两个文件:
(下图左为clang编译,右为gcc编译)。
发现使用gcc编译的文件多了段.note.ABI-tag、.note.gnu.build-i、.gnu.version、.gnu.version_r,缺少段.got.plt、.eh_frame_hdr、.bss.rel.ro
可以看到,缺少的和多出的字段都不具有X(执行)属性,理论上是不影响elf是否可以被执行的。
执行环境,out of memory的原因可能是:
Hi3516DV300实际采用芯片的结构为“ARMv7架构”,但采用gcc编译出的版本为v6,导致程序不可使用?
以上只是推测,实际情况还请大佬们评估。