以 hello.c 來來測試:
buildroot$ ./output/host/usr/bin/arm-linux-readelf --program-headers hello Elf file type is EXEC (Executable file) Entry point 0x82c8 There are 8 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align EXIDX 0x000494 0x00008494 0x00008494 0x00008 0x00008 R 0x4 PHDR 0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4 INTERP 0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.3] LOAD 0x000000 0x00008000 0x00008000 0x004a0 0x004a0 R E 0x8000 LOAD 0x0004a0 0x000104a0 0x000104a0 0x0011c 0x00120 RW 0x8000 DYNAMIC 0x0004ac 0x000104ac 0x000104ac 0x000e8 0x000e8 RW 0x4 NOTE 0x000148 0x00008148 0x00008148 0x00020 0x00020 R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 Section to Segment mapping: Segment Sections... 00 .ARM.exidx 01 02 .interp 03 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.exidx .eh_frame 04 .init_array .fini_array .jcr .dynamic .got .data .bss 05 .dynamic 06 .note.ABI-tag 07要要 /lib/ld-linux.so.3
所以在 android 上鍵一個 /lib,再再把把 ld-linux.so.3 copy 過去...
然後出現:
error while loading shared libraries: libc.so.6: cannot open shared object file: No such file ro directory所以 copy libc.so.6 到 /system/lib/
再執行就ok了,。
- http://www.eoeandroid.com/thread-22046-1-1.html
- http://thedevilking.blog.51cto.com/8144260/1364547
- http://stackoverflow.com/questions/8610103/how-do-you-cross-compile-elf-executables-for-android
- https://groups.google.com/forum/#!topic/android-internals/fHKKNkdPvAU
同時將 glibc 和 bionic 放到 android:
可以在 build toolchain 時,把 glibc 的 default path 改到 /lib
這樣 ld-linus.so 和 glibc 的 so 都會在 /lib
原本 android bionic 的 libc 會在 /systme/lib
就可以做出區別。
這樣的系統,用 toolchain build 出來的 elf, 可以在 android 系統上直接 run
附:
buildroot
build 出 buildroot 的 cross-tool 和 libc.
menuconfig: Target options: -- Target Architecture : ARM(little endian) -- Target Architecture Variant : (cortex-A9) -- Floating point strategy : VFPv2 Toolchain: -- kernel headers : Linux 3.0.x kernel header) -- C library : glibc -- Additional gcc options [*] enable C++ support
先用 default: lastest stable & uclibc
build 完後,修改 hello program 的 envsetup.sh
把 toolchain 指向 buildroot/out/usr/bin/arm-linux-
uclibc 沒有實做 execinfo.h 的 backtrace.
還有 progma 問題。
改用 tag: 2013.11 結果也一樣。
所以改用 glibc
OK
build 完完會在 out