11

最も単純なEXECUTABLEとSHARED_LIBRARYを作成しました。SHARED_LIBRARYは、LD_LIBRARY_PATHを変更せずにロードされません。

# ./hello
./hello
link_image[1995]: failed to link ./hello
CANNOT LINK EXECUTABLE

# LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./hello
Hello, world!

以下のすべてのコード:

first.h

#ifndef FIRST_H
#define FIRST_H

extern int first(int x, int y);

#endif /* FIRST_H */

first.c

#include "first.h"

int first( int x, int y ) {
    return x + y;
}

こんにちはC

#include <stdio.h>
#include "first.h"

int main( int argc, char **argv ) {
    printf( "Hello, world!\n" );
    first( 1000, 24 );
    return 0;
}

Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE    := first
LOCAL_SRC_FILES := first.c
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
LOCAL_SHARED_LIBRARIES := first
LOCAL_LDFLAGS := -Wl,-rpath,. -Wl,-rpath,/data/data/testlib/lib
include $(BUILD_EXECUTABLE)

readelf --all hello

...
Dynamic section at offset 0xef4 contains 25 entries:
Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  INTERP         0x000154 0x00008154 0x00008154 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /system/bin/linker]
...
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libfirst.so]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x0000000f (RPATH)                      Library rpath: [.:/data/data/testlib/lib]

RPATHはここにありますが、リンカーは何らかの理由でRPATHを使用しません。

どうやらダイナミックリンカーはAndroidで問題なく動作します(LD_LIBRARY_PATHを使用し、RPATHも異なりません)

私は何を間違えますか?

明らかな何かが欠けていますか?

私の例では、RPATHには2つのディレクトリ(.:/data/data/testlib/lib)があり、1つ(。)で十分です。

この例にはJavaはありません。プロジェクトでは使用されておらず、必要ありません。

基本的に、 LD_LIBRARY_PATHを変更したり(場合によっては不可能)、ラッパーを使用して必要なすべてのライブラリをdlopenすることなく、「マイディレクトリ」から共有ライブラリをロードする標準的な方法を探しています。

4

1 に答える 1

16

Bionicリンカーローダー(チェックしたい場合は、AOSPソースのandroid / bionic /linker /linker.c)はELFのRPATHを完全に無視しているようです。LD_LIBRARY_PATHと、「/ vendor/lib」および「/system/lib」のハードコードされた配列のみが考慮されます。

これは、私がチェックアウトしたアイスクリームサンドイッチツリーのコードの大まかなスキャンに基づいています。

これはあなたが見ている振る舞いを説明するでしょう。

于 2012-11-30T00:17:36.980 に答える