buildroot使用外部编译工具链,会导致panic,使用内部工具链,则可以正常启动。
Toolchain设置
1. Toolchain type (External toolchain) --->
2. Toolchain (Custom toolchain)
3. Toolchain origin (Pre-installed toolchain)
4. (/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi) Toolchain
5. (arm-linux-gnueabi) Toolchain prefix
6. External toolchain gcc version (7.x) --->
7. External toolchain kernel headers series (4.10.x)
8. External toolchain C library (glibc/eglibc)
9. [//*] Toolchain has SSP support? (NEW)
10.[//*] Toolchain has RPC support? (NEW)
问题:
1. 按照上面设置编译出来,运行会导致panic,如下,什么原因
[ 1.786977] VFS: Mounted root (jffs2 filesystem) on device 31:3.
[ 1.795787] devtmpfs: mounted
[ 1.805273] Freeing unused kernel memory: 1024K
[ 2.074266] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
[ 2.074266]
[ 2.083419] CPU: 0 PID: 1 Comm: init Not tainted 4.15.0-rc8-licheepi-nano+ #5
[ 2.090537] Hardware name: Allwinner suniv Family
[ 2.095323] [<c010e550>] (unwind_backtrace) from [<c010b6a8>] (show_stack+0x10/0x14)
[ 2.103079] [<c010b6a8>] (show_stack) from [<c0116878>] (panic+0xb8/0x230)
[ 2.109958] [<c0116878>] (panic) from [<c0118034>] (do_exit+0x96c/0x9a4)
[ 2.116659] [<c0118034>] (do_exit) from [<c0118bb8>] (do_group_exit+0x3c/0xb4)
[ 2.123877] [<c0118bb8>] (do_group_exit) from [<c0121758>] (get_signal+0x144/0x558)
[ 2.131537] [<c0121758>] (get_signal) from [<c010a934>] (do_signal+0xc4/0x404)
[ 2.138766] [<c010a934>] (do_signal) from [<c010ae3c>] (do_work_pending+0xb8/0xcc)
[ 2.146335] [<c010ae3c>] (do_work_pending) from [<c0107d48>] (slow_work_pending+0xc/0x20)
[ 2.154500] Rebooting in 5 seconds..
[ 8.133732] Reboot failed -- System halted
2. 使用外部工具链时,设置8. External toolchain C library (glibc/eglibc)必须选择glibc/eglibc ,不然编译会报错c lib选择错误,这是为何
3. 使用外部工具链时,设置7. External toolchain kernel headers series (4.10.x) 必须选择4.10.x , 我选4.15.x会报错显示预期是4.15,实际是4.10,
这个4.10.x是由哪里决定的?
4. 如果使用内部工具链,则设置8中的C library 随便选哪个都可以编译通过,而且系统可以正常运行,原因何在
在线
离线
第4个问题,内部tool chain, libc也是内部的(经过测试的版本),当然随便怎么选都ok
离线
第一张图是buildroot 2019里面的Config.in
第二张是2017
人家规定了版本
至于4.10可以,4.15报错,要看看她的buildroot里面的具体情况
有些脚本编写时可能没有考虑到新版本
这个在./configure时经常出现,不知道buildroot是不是一样存在
离线
第3个问题是读的外部工具链的内核版本
离线
uboot kernel 都是用/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi编译,为何buildroot用一样的编译器就不行了
在线
uboot kernel 都是用/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi编译,为何buildroot用一样的编译器就不行了
用 -v 参数打印出来看下, 可能要设置一个参数, 如果用默认参数编译会生成arm9识别不了的指令,然后就没有然后了。
离线
cris8259 说:uboot kernel 都是用/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi编译,为何buildroot用一样的编译器就不行了
用 -v 参数打印出来看下, 可能要设置一个参数, 如果用默认参数编译会生成arm9识别不了的指令,然后就没有然后了。
你的意思是buildroot生成了arm9的指令?你是指打印什么参数,需要设置什么参数
在线
应该是说buildroot生成的arm-linux-gcc,用这个编译出的应用程序是没有问题的,而别的工具链由于参数的问题,生成的应用程序指令集有问题。
离线
应该是说buildroot生成的arm-linux-gcc,用这个编译出的应用程序是没有问题的,而别的工具链由于参数的问题,生成的应用程序指令集有问题。
就是说编译buildroot 和 app 用 buildroot生成的工具链,这样参数不会有问题,而编译BootLoader和kernel用buildroot生成的工具链或者其他工具链都行,是这个意思吗
在线
楼主有没有解决?我也遇到和你一模一样的问题,郁闷中
离线
就是说编译buildroot 和 app 用 buildroot生成的工具链,这样参数不会有问题,而编译BootLoader和kernel用buildroot生成的工具链或者其他工具链都行,是这个意思吗
你要混用外部工具链,就要做到兼容buildroot,参数包括:libc、eabi、fp等的设置。即,编译组织root文件系统的工具链和编译Kernel时用的工具链参数兼容。Kernel是需要配合root上的libc环境的,接口不兼容自然会影响相关依赖代码的执行。
离线
4. (/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi) Toolchain
5. (arm-linux-gnueabi) Toolchain prefix
研究好几天,
编译器 改为 arm-none-linux-gnueabi 就好了.
离线
你要混用外部工具链,就要做到兼容buildroot,参数包括:libc、eabi、fp等的设置。即,编译组织root文件系统的工具链和编译Kernel时用的工具链参数兼容。Kernel是需要配合root上的libc环境的,接口不兼容自然会影响相关依赖代码的执行。
原来如此,本来打算在 linux 用 mingw + buildroot 编译win32平台软件,结果libc 不存在就直接 gg 了。
离线
圈子好小,搜了一圈,又搜到坑网了,这个错误真是坑
离线
圈子好小,搜了一圈,又搜到坑网了,这个错误真是坑
是的 遇到同样的问题,最后还得来坑网填坑.
离线
废话:它其实是想知道当年编译这个交叉编译器的内核的版本(不要问我上一个交叉编译器的版本)。
External toolchain kernel headers series = 4.20.x //交叉编译器的linux 版本号
这个版本号 指的不是即将编译的Linux内核的版本号 而是指的是当初编译这个编译工具的Linux内核版本号
这个版本号去哪里找呢?
找到编译工具链的目录,然后使用下述命令来找
find . |grep version.h
比如这个 ./arm-none-linux-gnueabihf/libc/usr/include/linux/version.h
用vim打开这个文件,得到
#define LINUX_VERSION_CODE 267277
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
267277是十进制的,变成16进制是 0x4140D 分割成3组是0x04 0x14 0x0D 写成十进制表示则是 4.20.13
离线