内核为64位内核,使用64位toolchain编译busybox,将busybox安装到rootfs,并添加/etc/inittab, /etc/init.d/rcS, /etc/fstab 3个文件。
/etc/inittab文件:
1 2 | ::sysinit: /etc/init .d /rcS ttyS0::askfirst:- /bin/sh |
/etc/init.d/rcS
1 2 3 4 5 6 7 | #!/bin/sh mkdir /dev/pts mount -a echo /sbin/mdev > /proc/sys/kernel/hotplug /sbin/mdev -s |
mount -a将挂载fstab中指定的文件系统,需要先创建/dev/pts。
/etc/fstab
1 2 3 4 5 | none /tmp tmpfs defaults,noatime,nosuid,nodev,mode=1777,size=128M 0 0 none /run tmpfs defaults,noatime,nosuid,nodev,mode=1777,size=16M 0 0 none /proc proc defaults 0 0 none /dev/pts devpts defaults 0 0 none /sys sysfs defaults 0 0 |
第一列是设备名如/dev/sda1,对于伪文件系统,可以为任意字符串,/dev已经由内核挂载,所以不需要添加下面这行:
1 | none /dev devtmpfs defaults 0 0 |
1 没有指定init,通过cmdline添加init选项:
1 | init=/linuxrc |
2 init运行错误,error=-2,猜测是共享库的路径不对,首先使用readelf -l查看Program Headers中INTERP头定义的解释器路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | $ aarch64-rpi3-linux-gnueabi-readelf -l bin/busybox Elf file type is EXEC (Executable file) Entry point 0x407dd0 There are 8 program headers, starting at offset 64 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040 0x00000000000001c0 0x00000000000001c0 R E 0x8 INTERP 0x0000000000000200 0x0000000000400200 0x0000000000400200 0x000000000000001b 0x000000000000001b R 0x1 [Requesting program interpreter: /lib/ld-linux-aarch64.so.1] LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000 0x00000000000e7310 0x00000000000e7310 R E 0x10000 LOAD 0x00000000000e7de0 0x00000000004f7de0 0x00000000004f7de0 0x000000000000105c 0x00000000000017e0 RW 0x10000 DYNAMIC 0x00000000000e7df8 0x00000000004f7df8 0x00000000004f7df8 0x00000000000001e0 0x00000000000001e0 RW 0x8 NOTE 0x000000000000021c 0x000000000040021c 0x000000000040021c 0x0000000000000020 0x0000000000000020 R 0x4 GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 0x10 GNU_RELRO 0x00000000000e7de0 0x00000000004f7de0 0x00000000004f7de0 0x0000000000000220 0x0000000000000220 R 0x1 Section to Segment mapping: Segment Sections... 00 01 .interp 02 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame 03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 04 .dynamic 05 .note.ABI-tag 06 07 .init_array .fini_array .jcr .dynamic .got |
发现路径是/lib/ld-linux-aarch64.so.1,而之前拷贝成/lib64/ld-linux-aarch64.so.1
3 libm.so无此文件,使用readelf -d查看dynamic section中依赖的共享库:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | $ aarch64-rpi3-linux-gnueabi-readelf -d bin/busybox Dynamic section at offset 0xe7df8 contains 25 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libm.so.6] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000c (INIT) 0x4065f0 0x000000000000000d (FINI) 0x4c08cc 0x0000000000000019 (INIT_ARRAY) 0x4f7de0 0x000000000000001b (INIT_ARRAYSZ) 8 (bytes) 0x000000000000001a (FINI_ARRAY) 0x4f7de8 0x000000000000001c (FINI_ARRAYSZ) 8 (bytes) 0x0000000000000004 (HASH) 0x400240 0x0000000000000005 (STRTAB) 0x403160 0x0000000000000006 (SYMTAB) 0x400c88 0x000000000000000a (STRSZ) 3291 (bytes) 0x000000000000000b (SYMENT) 24 (bytes) 0x0000000000000015 (DEBUG) 0x0 0x0000000000000003 (PLTGOT) 0x4f7fe8 0x0000000000000002 (PLTRELSZ) 9072 (bytes) 0x0000000000000014 (PLTREL) RELA 0x0000000000000017 (JMPREL) 0x404280 0x0000000000000007 (RELA) 0x404190 0x0000000000000008 (RELASZ) 240 (bytes) 0x0000000000000009 (RELAENT) 24 (bytes) 0x000000006ffffffe (VERNEED) 0x404150 0x000000006fffffff (VERNEEDNUM) 2 0x000000006ffffff0 (VERSYM) 0x403e3c 0x0000000000000000 (NULL) 0x0 |
发现依赖libm.so和libc.so,而这两个已经放到了/lib下面,查看toolchain中sysroot相关文件:
1 2 3 4 5 6 7 8 | $ ls -l /work/toolchain/aarch64-rpi3-linux-gnueabi/aarch64-rpi3-linux-gnueabi/sysroot/ total 20 dr-xr-xr-x 2 herbert herbert 4096 Mar 29 20:59 etc dr-xr-xr-x 2 herbert herbert 4096 Mar 29 21:04 lib lrwxrwxrwx 1 herbert herbert 3 Mar 29 20:52 lib64 -> lib dr-xr-xr-x 2 herbert herbert 4096 Mar 29 20:59 sbin dr-xr-xr-x 8 herbert herbert 4096 Mar 29 20:59 usr dr-xr-xr-x 3 herbert herbert 4096 Mar 29 20:59 var |
发现lib64指向lib,怀疑ld只会搜索lib64路径,因此在rootfs中也创建一个lib64指向lib,成功解决问题,init可正常工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [ 4.571414] VFS: Mounted root (nfs filesystem) readonly on device 0:15. [ 4.579065] devtmpfs: mounted [ 4.587375] Freeing unused kernel memory: 2688K Please press Enter to activate this console. / # ls -l total 20 drwxrwxr-x 2 1000 1000 4096 Jun 9 2018 bin drwxr-xr-x 5 0 0 2600 Jan 1 00:00 dev drwxrwxr-x 3 1000 1000 4096 Jun 9 2018 etc drwxrwxr-x 3 1000 1000 4096 Jun 9 2018 lib lrwxrwxrwx 1 1000 1000 3 Jun 9 2018 lib64 -> lib lrwxrwxrwx 1 1000 1000 11 Jun 9 2018 linuxrc -> bin/busybox dr-xr-xr-x 48 0 0 0 Jan 1 00:00 proc drwxrwxrwt 2 0 0 40 Jan 1 00:00 run drwxrwxr-x 2 1000 1000 4096 Jun 9 2018 sbin dr-xr-xr-x 12 0 0 0 Jan 1 00:00 sys drwxrwxrwt 2 0 0 40 Jan 1 00:00 tmp drwxrwxr-x 4 1000 1000 4096 Jun 9 2018 usr |