ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2015年7月23日 星期四

android : run glibc linked elf file

使用 buildroot build 出自己的的 arm-linux-gcc 和 glibc

以 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

沒有留言:

標籤

網誌存檔