2016-08-23 12 views
1

Я хотел бы запустить общую библиотеку x86, которую я захватил из apk на не-андроидной Linux-машине.Реализации затухания Bionic и libc

Он связан с android libc, поэтому я схватил libc.so от android ndk. После отладки ошибки сегментации на некоторое время, я понял, что libc.so это «обман» и содержит только NOP реализацию многих функций библиотеки:

$ objdump -d libc.so | grep memalign -A 8 
0000bf82 <memalign>: 
    bf82:  55      push %ebp 
    bf83:  89 e5     mov %esp,%ebp 
    bf85:  5d      pop %ebp 
    bf86:  c3      ret  

Теперь НКА также содержит libc.a, который содержит фактические реализации этих функций, но как я получаю свой процесс для загрузки этих и переопределения функций nop libc.so? Был бы также заинтересован в другом контексте, почему андроид делает этот трюк и как работает надстройка.

ответ

1

Как вы видите, libc.so, который взят из NDK, содержит только заглушки, поскольку он предназначен для предоставления необходимой информации компоновщику во время создания вашей собственной общей библиотеки или исполняемого файла. Вот nice explanation, почему нам нужны библиотеки-заглушки.

Так что, если вам нужен настоящий libc.so двоичный - есть две альтернативы:

  1. захватить его прямо из Android устройства:

    $ adb pull /system/lib/libc.so <local_destination> 
    
  2. Скачать завод ROM изображения для вашего устройства, распаковать его , установите system.img в локальную файловую систему, а затем снова скопируйте ее с /system/lib этого смонтированного раздела.

Но даже если у вас есть правильный бинарный файл, это действительно больно exersize - чтобы он работал на вашем рабочем столе Linux. Существует по крайней мере две причины:

  1. Для Android и настольных Linux ELF требуются разные интерпретаторы. Вы можете проверить это с readelf:

    $ readelf --all <android_binary> | grep interpreter 
    [Requesting program interpreter: /system/bin/linker] 
    $ readelf --all <linux_x64_binary> | grep interpreter 
    [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] 
    

    (переводчик это небольшая программа, которая выполняет фактическую загрузку бинарного файла и загружается ядром) Очевидно, что система Linux не имеет /system/bin/linker и ядро ​​будет отвергать загрузку такого двоичного файла. Поэтому вы должны как-то правильно загружать разделы и самостоятельно решать все зависимости.

  2. Ядро Android не такое же, как у настольного компьютера, оно имеет некоторые дополнительные функции, от которых зависит libc.so, поэтому даже если вы загружаете ELF, он по-прежнему несовместим с вашим ядром, и наверняка в какой-то момент у вас появятся проблемы.

В довершение: это практически невозможно повторно использовать андроид исполняемые файлы на рабочем столе GNU/Linux, даже если они ориентированы с той же аппаратной архитектуры.