Adding HIDL service to vendor with prebuilt libraries (Android P)

848 views
Skip to first unread message

Tore Offermann

unread,
Aug 8, 2019, 12:50:39 PM8/8/19
to Android Building
Hello everyone,

I am currently fighting adding a vendor HIDL service with prebuilt libraries on Android Pie.

The HIDL service is created in vendor/...
It depends on some prebuilt libraries.

The prebuilt libraries are added to the Makefile for the service as follows:

include $(CLEAR_VARS)
LOCAL_PROPRIETARY_MODULE
:= true
LOCAL_MODULE_SUFFIX
:= .so
LOCAL_MODULE_CLASS
:= SHARED_LIBRARIES
LOCAL_MODULE
:= libTest
LOCAL_SRC_FILES
:= lib/libTest.so
#include $(BUILD_PREBUILT)

During android make the library is correctly copied to /vendor/lib and after I flash the device the lib is also available in that folder.

I added the lib to the HIDL service makefile:

include $(CLEAR_VARS)

LOCAL_MODULE := xxx.hard...@1.0-service
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_INIT_RC := xxx.hard...@1.0-service.rc
LOCAL_CFLAGS := -Werror

LOCAL_SRC_FILES := service.cpp

LOCAL_C_INCLUDES := $(subst ${ANDROID}/,,$(LOCAL_C_INCLUDES))


LOCAL_SHARED_LIBRARIES := \
    xxx.hardware.test@1.0 \
    libhidlbase \
    libhidltransport \
    libbase \
    liblog \
    libutils \
    libTest

include $(BUILD_EXECUTABLE)


No issues during make, but after I start the device the linker complains with:

08-08 10:13:34.014  6814  6814 F linker  : CANNOT LINK EXECUTABLE "/vendor/bin/hw/xxx.hard...@1.0-service": library "out/target/product/xxx/obj/lib/libTest.so" not found

Not sure how this can happen?
I would suppose that the linker should check for the lib in /vendor/lib.

Could it have something to do with:

LOCAL_PRELINK_MODULE := false

Thanks in advance!

BR,
Tore

Colin Cross

unread,
Aug 8, 2019, 1:47:47 PM8/8/19
to android-...@googlegroups.com
Likely libTest.so is built incorrectly and xxx.hard...@1.0-service is ending up with an incorrect DT_NEEDED entry.  Can you show the output of objdump -x lib/libTest.so and objdump -x $OUT/vendor/bin/hw/xxx.hard...@1.0-service?  My guess is that SONAME in libTest.so is "out/target/product/xxx/obj/lib/libTest.so" and that gets copied into NEEDED in xxx.hard...@1.0-service.

--
--
You received this message because you are subscribed to the "Android Building" mailing list.
To post to this group, send email to android-...@googlegroups.com
To unsubscribe from this group, send email to
android-buildi...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-building?hl=en

---
You received this message because you are subscribed to the Google Groups "Android Building" group.
To unsubscribe from this group and stop receiving emails from it, send an email to android-buildi...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/android-building/d6699eb8-3c08-4ac1-8e74-fb8634b1bd1f%40googlegroups.com.

Tore Offermann

unread,
Aug 13, 2019, 9:58:58 AM8/13/19
to Android Building
Thanks for the fast response!
Executing objdump -x on the service:

Dynamic Section:
 
...
  NEEDED               xxx
.hardware.test@1.0.so
  NEEDED               libhidlbase
.so
  NEEDED               libhidltransport
.so
  NEEDED               libbase
.so
  NEEDED               liblog
.so
  NEEDED               libutils
.so
  NEEDED              
out/target/product/xxx/obj/lib/libTest.so
  NEEDED               libc
++.so
  NEEDED               libc
.so
  NEEDED               libm
.so
  NEEDED               libdl
.so
  PREINIT_ARRAY        
0x00008ba0
  PREINIT_ARRAYSZ      
0x00000008
  INIT_ARRAY          
0x00008ba8
  INIT_ARRAYSZ        
0x00000008
  FINI_ARRAY          
0x00008bb0
  FINI_ARRAYSZ        
0x00000008
  FLAGS                
0x00000008
  FLAGS_1              
0x00000001
  VERSYM              
0x00004f34
  VERNEED              
0x0000511c
  VERNEEDNUM          
0x00000002

The libTest.so built with clang in own build environment does not have a SONAME.
Dynamic Section:
  PLTGOT              
0x00003f84
  PLTRELSZ            
0x000000e0
  JMPREL              
0x00000b08
  PLTREL              
0x00000011
  REL                  
0x00000a40
  RELSZ                
0x000000c8
  RELENT              
0x00000008
  RELCOUNT            
0x00000014
  SYMTAB              
0x000001cc
  SYMENT              
0x00000010
  STRTAB              
0x000004dc
  STRSZ                
0x00000398
  GNU_HASH            
0x00000874
  NEEDED               libdl
.so
  NEEDED               libc
.so
  FINI_ARRAY          
0x00003e28
  FINI_ARRAYSZ        
0x00000008
  FLAGS                
0x00000008
  FLAGS_1              
0x00000001
  VERSYM              
0x00000970
  VERDEF              
0x000009d4
  VERDEFNUM            
0x00000001
  VERNEED              
0x000009f0
  VERNEEDNUM          
0x00000002Cod
 
...

If the test library is built via the android make system the SONAME is set.
Do you think adding the soname via compiler flag like could solve the problem?
e,g,;
-Wl,-soname,libTest.so

Am Donnerstag, 8. August 2019 19:47:47 UTC+2 schrieb Colin Cross:
Likely libTest.so is built incorrectly and xxx.hardware.test@1.0-service is ending up with an incorrect DT_NEEDED entry.  Can you show the output of objdump -x lib/libTest.so and objdump -x $OUT/vendor/bin/hw/xxx.hardwa...@1.0-service?  My guess is that SONAME in libTest.so is "out/target/product/xxx/obj/lib/libTest.so" and that gets copied into NEEDED in xxx.hardware.test@1.0-service.

08-08 10:13:34.014  6814  6814 F linker  : CANNOT LINK EXECUTABLE "/vendor/bin/hw/xxx.hardware.te...@1.0-service": library "out/target/product/xxx/obj/lib/libTest.so" not found

Not sure how this can happen?
I would suppose that the linker should check for the lib in /vendor/lib.

Could it have something to do with:

LOCAL_PRELINK_MODULE := false

Thanks in advance!

BR,
Tore

--
--
You received this message because you are subscribed to the "Android Building" mailing list.
To post to this group, send email to android-...@googlegroups.com
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/android-building?hl=en

---
You received this message because you are subscribed to the Google Groups "Android Building" group.
To unsubscribe from this group and stop receiving emails from it, send an email to android-...@googlegroups.com.

Mark Gio Evangelista

unread,
Feb 5, 2020, 6:43:52 PM2/5/20
to Android Building
Hello Tore Offermann, do you have any updates about this?
Reply all
Reply to author
Forward
0 new messages