无法加载共享库,因为主要编号是作为库依赖项的一部分给出的

时间:2011-06-14 10:07:49

标签: android gcc linker android-ndk

我一直在创建一组在Android手机上运行的共享库。当我尝试加载它们时它们失败了,它看起来好像我的共享库所依赖的库已经用它们的主编号命名。

我应该解释一下,我没有使用ndk- *命令,只使用ndk工具链和通常的配置脚本。

作为一个简单的例子,尽管我的其他lib都在做同样的事情。我构建了libtiff,它依赖于libjpeg。如果我在libtiff上做一个readelf,我会得到这个。

$ /c/android/android-ndk-r5b/toolchains/arm-eabi-4.4.0/prebuilt/windows/bin/arm-eabi-readelf.exe -d libs/armeabi/libtiff.so

Dynamic section at offset 0x79988 contains 25 entries:
  Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [libjpeg.so.8]
0x00000001 (NEEDED)                     Shared library: [libz.so]
0x00000001 (NEEDED)                     Shared library: [libm.so]
0x00000001 (NEEDED)                     Shared library: [libc.so]
0x00000001 (NEEDED)                     Shared library: [libdl.so]
0x0000000e (SONAME)                     Library soname: [libtiff.so.3]
0x00000010 (SYMBOLIC)                   0x0
0x0000000f (RPATH)                      Library rpath: [c:/Users/whadden/workspace/jni_debug/jpeg-8c/.libs:C:/MinGW/ms
s/1.0/local/lib]
0x00000004 (HASH)                       0xb4
0x00000005 (STRTAB)                     0x1f54
0x00000006 (SYMTAB)                     0xa24
0x0000000a (STRSZ)                      5195 (bytes)
0x0000000b (SYMENT)                     16 (bytes)
0x00000003 (PLTGOT)                     0x7aa70
0x00000002 (PLTRELSZ)                   768 (bytes)
0x00000014 (PLTREL)                     REL
0x00000017 (JMPREL)                     0x4110
0x00000011 (REL)                        0x3668
0x00000012 (RELSZ)                      2728 (bytes)
0x00000013 (RELENT)                     8 (bytes)
0x6ffffffe (VERNEED)                    0x3648
0x6fffffff (VERNEEDNUM)                 1
0x6ffffff0 (VERSYM)                     0x33a0
0x6ffffffa (RELCOUNT)                   339
0x00000000 (NULL)                       0x0

正如你所看到的,我希望看到libjpeg被命名为libjpeg.so而不是libjpeg.so.8。由于这是部署到Android手机我不认为我可以创建符号链接来解决这个问题,我不认为我应该是。

当我尝试通过与手机的系统库进行测试链接来导致问题时,我得到了

$ /cygdrive/c/android/android-ndk-r5b/toolchains/arm-eabi-4.4.0/prebuilt/window
s/bin/arm-eabi-ld libtiff.so -rpath=.
C:\android\android-ndk-r5b\toolchains\arm-eabi-4.4.0\prebuilt\windows\bin\arm-eabi-ld.exe: warning: libjpeg.so.8, needed
by libtiff.so, not found (try using -rpath or -rpath-link)
C:\android\android-ndk-r5b\toolchains\arm-eabi-4.4.0\prebuilt\windows\bin\arm-eabi-ld.exe: warning: cannot find entry sy
mbol _start; defaulting to 00008260
libtiff.so: undefined reference to `__aeabi_ui2f@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_CreateCompress@LIBJPEG_8.0'
libtiff.so: undefined reference to `__aeabi_i2f@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_std_error@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_write_raw_data@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_set_defaults@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_finish_decompress@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_set_colorspace@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_suppress_tables@LIBJPEG_8.0'
libtiff.so: undefined reference to `__aeabi_fdiv@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_read_header@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_write_tables@LIBJPEG_8.0'
libtiff.so: undefined reference to `__aeabi_fsub@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_abort@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_set_quality@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_read_scanlines@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_resync_to_restart@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_destroy@LIBJPEG_8.0'
libtiff.so: undefined reference to `__aeabi_f2iz@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_start_decompress@LIBJPEG_8.0'
libtiff.so: undefined reference to `__aeabi_fadd@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_start_compress@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_write_scanlines@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_read_raw_data@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_CreateDecompress@LIBJPEG_8.0'
libtiff.so: undefined reference to `__aeabi_fmul@LIBJPEG_8.0'
libtiff.so: undefined reference to `jpeg_finish_compress@LIBJPEG_8.0'

这表明还没有找到libjpeg,但如果我将libjpeg重命名为libjpeg.so.8,那么我不会得到这些错误。

我应该这样 a)修复构建,以便共享库中没有引用的主号,更重要的是我该怎么做? b)在文件系统中使用主要编号命名构建库? (我认为这是错误的)

/编辑

用于.o的命令行的一个例子是

libtool: compile: arm-linux-androideabi-gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I/c/Users/whadden/workspace/jni/jpeg-8c -I/c/Users/whadden/workspace/jni/tiff-3.9.5/libtiff -O3 -mandroid -nostdlib -I/c/Users/whadden/workspace/jni/jpeg-8c -I/c/Users/whadden/workspace/jni/tiff-3.9.5/libtiff -Wall -W -MT tif_getimage.lo -MD -MP -MF .deps/tif_getimage.Tpo -c tif_getimage.c -fPIC -DPIC -o .libs/tif_getimage.o

顺便说一下,我刚搬到了新的NDK R6

由于 威尔

2 个答案:

答案 0 :(得分:1)

  

我应该解释一下,我没有使用ndk- *命令,只使用ndk工具链和通常的配置脚本。

虽然您的配置脚本正在生成使用ndk编译器的内容,但它实际上可能是为开发机器环境中自动检测到的某些属性构建的,例如libjpeg.so.8可能是正确的。

您可能需要修复配置脚本或手动编辑makefile,您甚至可以使用sed执行此操作。

答案 1 :(得分:0)

最后我发现了一个解释我自己问题的链接,它看起来像是android的限制。静态链接我们来了

http://comments.gmane.org/gmane.comp.handhelds.android.ndk/11819