dlopen failed: empty/missing DT_HASH in "libx.so" (built with --hash-style=gnu?)

崩溃日志内容:
java.lang.UnsatisfiedLinkError: dlopen failed: empty/missing DT_HASH in "libxxxx.so" (built with --hash-style=gnu?)
at java.lang.Runtime.loadLibrary(Runtime.java:371)
at java.lang.System.loadLibrary(System.java:989)

崩溃设备信息:
{
"STARTTIME": "1970-01-01 08:00:00",
"CRASHTIME": "2015-08-14 01:47:28",
"DEVICEID": "6aa3a6d0cbcb3251",
"DEVICE": "hlte",
"FINGERPRINT": "samsung/h3gduosctc/hlte:5.0/LRX21V/N9009KEU2GOF1:user/release-keys",
"MODEL": "SM-N9009",
"OSVERSION": "5.0",
"CPU_ABI": "armeabi-v7a",
"IMEI": "A00000443A46BD",
"CPU_ABI2": "armeabi",
……
}

解决方案:
http://stackoverflow.com/questions/28638809/android-ndk-unsatisfiedlinkerror-dlopen-failed-empty-missing-dt-hash

ThelibraryyouaretryingtoloadwasmostlikelybuiltwithWl,hash-style=gnu.ThiswasnotsupportedonAndroiduntilrecently(afaikthisisn'teveninL).Youneedtobuildyourlibrarieswith -Wl,-hash-style=sysv.

Howdidyoubuildcpplibrary.so?Ifyoudidn'tdoanythingtomanuallyswitchtothegnuhashstyle,itcouldbeabugintheNDK.

One option is to add "LOCAL_LDFLAGS := -Wl,--hash-style=sysv" at screenrecord Android.mk though I am sure there is a less hacky method of doing so..

总结了一下是需要在Android.mk中添加链接选项:
LOCAL_LDFLAGS := Wl,-hash-style=sysv
libsysv-hash-table-library_ldflags := Wl,-hash-style=sysv

于是在修改前后查看了一下so节的变化:
readelf.exe -dlibxxxx.so
Dynamic section at offset 0xed14 contains 27 entries: Tag Type Name/Value 0x00000003 (PLTGOT) 0xfee0
0x00000002 (PLTRELSZ) 552 (bytes) 0x00000017 (JMPREL) 0x46fc
0x00000014 (PLTREL) REL 0x00000011 (REL) 0x39c4
0x00000012 (RELSZ) 3384 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x6ffffffa (RELCOUNT) 420
0x00000006 (SYMTAB) 0x148
0x0000000b (SYMENT) 16 (bytes) 0x00000005 (STRTAB) 0x1918
0x0000000a (STRSZ) 5780 (bytes) 0x00000004 (HASH) 0x2fac
0x00000001 (NEEDED) Shared library: [liblog.so] 0x00000001 (NEEDED) Shared library: [libdl.so] 0x00000001 (NEEDED) Shared library: [libstdc++.so] 0x00000001 (NEEDED) Shared library: [libm.so] 0x00000001 (NEEDED) Shared library: [libc.so] 0x0000000e (SONAME) Library soname: [libbugrpt.so] 0x0000001a (FINI_ARRAY) 0xf590
0x0000001c (FINI_ARRAYSZ) 8 (bytes) 0x00000019 (INIT_ARRAY) 0xf598
0x0000001b (INIT_ARRAYSZ) 16 (bytes) 0x00000010 (SYMBOLIC) 0x0
0x0000001e (FLAGS) SYMBOLIC BIND_NOW 0x6ffffffb (FLAGS_1) Flags: NOW 0x00000000 (NULL) 0x0

readelf.exe -dlibxxxx.so
Dynamic section at offset 0xed14 contains 27 entries: Tag Type Name/Value 0x00000003 (PLTGOT) 0xfee0
0x00000002 (PLTRELSZ) 552 (bytes) 0x00000017 (JMPREL) 0x46fc
0x00000014 (PLTREL) REL 0x00000011 (REL) 0x39c4
0x00000012 (RELSZ) 3384 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x6ffffffa (RELCOUNT) 420
0x00000006 (SYMTAB) 0x148
0x0000000b (SYMENT) 16 (bytes) 0x00000005 (STRTAB) 0x1918
0x0000000a (STRSZ) 5780 (bytes) 0x00000004 (HASH) 0x2fac
0x00000001 (NEEDED) Shared library: [liblog.so] 0x00000001 (NEEDED) Shared library: [libdl.so] 0x00000001 (NEEDED) Shared library: [libstdc++.so] 0x00000001 (NEEDED) Shared library: [libm.so] 0x00000001 (NEEDED) Shared library: [libc.so] 0x0000000e (SONAME) Library soname: [libbugrpt.so] 0x0000001a (FINI_ARRAY) 0xf590
0x0000001c (FINI_ARRAYSZ) 8 (bytes) 0x00000019 (INIT_ARRAY) 0xf598
0x0000001b (INIT_ARRAYSZ) 16 (bytes) 0x00000010 (SYMBOLIC) 0x0
0x0000001e (FLAGS) SYMBOLIC BIND_NOW 0x6ffffffb (FLAGS_1) Flags: NOW 0x00000000 (NULL) 0x0
修改前后的节并没有什么变化,然并卵啊!


版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(dlopen failed: empty/missing DT_HASH in "libx.so" (built with --hash-style=gnu?))