平台
IMX6Q 32-bit Armv7 Cortex-A
升级步骤
- 下载对应的工具链
工具链下载地址为https://www.linaro.org/downloads/。由于我的平台是Armv7a的,所以我选择下载了gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabi工具链。
在该网站上还可以下载目标板上的运行环境:sysroot-eglibc-linaro-2017.01-arm-linux-gnueabi.tar.xz。该包里边有一些目标板上运行是需要的库,我会在下边进行说明。 - 拷贝运行环境到目标板
在目标板上运行的时候,至少需要以下几个库文件,我们需要拷贝到目标板上。
libc.so.6
libgcc_s.so.1
libm.so.6
libstdc++.so.6
ld-linux.so.3 - 运行测试
把上述的文件拷贝到目标板的work_place/目录下,用我们的工具链编译一个可执行文件放到work_palce/目录下。
执行:./ld-linux.so.3 ./a.out
注意:ld-linux.so.3 需要有可执行权限,我们需要用它来load共享库。如果直接在work_place目录执行./a.out的话,我这边会出现来“./a.out: error while loading shared libraries: libc.so.6: unexpected reloc type oxa0 0xa0”。原因是用目标板上原来自带的4.6的ld-linux.so.3,它会不认识4.9.4的libc.so.6中的reloc type oxa0。
目标板上运行库的默认是在/lib目录,如果没有显示指定的话,那么会调用默认的库来运行。我这里在当前目录执行,避免了使用/lib目下的库文件。
参考资料
- 有关共享库的资料:http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
- 有关ELF格式的资料:http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044f/IHI0044F_aaelf.pdf
- 我在升级的工程中用的工具:readelf objdump arm-linux-gnueabi-strings
- 特别有用的环境变量:export LD_DEBUG=reloc 。使用之后,在执行程序的时候可以有如下的效果,很方便调试。
root@Emd-6Q$ ./ld-linux.so.3 ./a.out
9162:
9162: relocation processing: libc.so.6 (lazy)
9162:
9162: relocation processing: libgcc_s.so.1 (lazy)
9162:
9162: relocation processing: libm.so.6 (lazy)
9162:
9162: relocation processing: libstdc++.so.6 (lazy)
9162:
9162: relocation processing: ./a.out (lazy)
9162:
9162: relocation processing: ./ld-linux.so.3
9162:
9162: calling init: libc.so.6
9162:
9162:
9162: calling init: libgcc_s.so.1
9162:
9162:
9162: calling init: libm.so.6
9162:
9162:
9162: calling init: libstdc++.so.6
9162:
9162:
9162: initialize program: ./a.out
9162:
9162:
9162: transferring control: ./a.out
9162:
uptime 88720
9162:
9162: calling fini: ./a.out [0]
9162:
9162:
9162: calling fini: libstdc++.so.6 [0]
9162:
9162:
9162: calling fini: libm.so.6 [0]
9162:
9162:
9162: calling fini: libgcc_s.so.1 [0]
9162:
9162:
9162: calling fini: libc.so.6 [0]
9162: