andle == NULL) {
char const *err_str = dlerror();
ALOGE("load: module=%s\n%s", path, err_str?err_str:"unknown");
status = -EINVAL;
goto done;
}
/* Get the address of the struct hal_module_info. */
const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
hmi = (struct hw_module_t *)dlsym(handle, sym);
if (hmi == NULL) {
ALOGE("load: couldn't find symbol %s", sym);
status = -EINVAL;
goto done;
}
/* Check that the id matches */
if (strcmp(id, hmi->id) != 0) {
ALOGE("load: id=%s != hmi->id=%s", id, hmi->id);
status = -EINVAL;
goto done;
}
hmi->dso = handle;
/* success */
status = 0;
done:
if (status != 0) {
hmi = NULL;
if (handle != NULL) {
dlclose(handle);
handle = NULL;
}
} else {
ALOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",
id, path, *pHmi, handle);
}
*pHmi = hmi;
return status;
}
- 首先通过dlopen打开sensors.xxx.so模块,获得其句柄handle
- 调用dlsym去获取结构体hw_module_t结构体的地址,注意这里传入的字符串为HAL_MODULE_INFO_SYM_AS_STR,定义在hardware.h头文件中
/**
* Name of the hal_module_info
*/
#define HAL_MODULE_INFO_SYM HMI
/**
* Name of the hal_module_info as a string
*/
#define HAL_MODULE_INFO_SYM_AS_STR "HMI"
这里为什么要去取名字为HMI的地址,我猜想它应该是HAL模块的入口了。
ELF文件格式:
ELF = Executable and Linkable Format,可执行连接格式,是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,扩展名为elf。一个ELF头在文件的开始,保存了路线图(road map),描述了该文件的组织情况。sections保存着object 文件的信息,从连接角度看:包括指令,数据,符号表,重定位信息等等。通过file命令我们可知sensors.xx.so是一个ELF文件格式
tiny.hui@build-server:~$ file sensors.msm8909.so
sensors.msm8909.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked (uses shared libs), BuildID[md5/uuid]=0x25812b01ab4700281b41f61327075611, not stripped
因此,通过linux的readelf命令我们可以查看该文件的内部布局及符号表等信息。
tiny.hui@build-server:~$ readelf -s sensors.msm8909.so
Symbol table '.dynsym' contains 157 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FUNC GLOBAL DEFAULT UND __cxa_finalize@LIBC (2)
2: 00000000 0 FUNC GLOBAL DEFAULT UND __cxa_atexit@LIBC (2)
3: 00000000 0 FUNC GLOBAL DEFAULT UND __register_atfork@LIBC (2)
4: 00000000 0 FUNC GLOBAL DEFAULT UND pthread_mutex_lock@LIBC (2)
…………………………// 省略无关信息
179: 0000c179 120 FUNC GLOBAL DEFAULT 13 _ZN19NativeSensorManager1
180: 0000bd21 392 FUNC GLOBAL DEFAULT 13 _ZN19NativeSensorManager2
181: 0000a45b 114 FUNC GLOBAL DEFAULT 13 _ZN24InputEventCircularRe
182: 000064d9 148 FUNC GLOBAL DEFAULT 13 _ZN22sensors_poll_context
183: 0000d889 6 FUNC GLOBAL DEFAULT 13 _ZN11sensors_XMLC1Ev
184: 0000663d 156 FUNC GLOBAL DEFAULT 13 _ZN10SensorBaseC2EPKcS1_P
185: 000086d5 248 FUNC GLOBAL DEFAULT 13 _ZN11AccelSensorC1Ev
186: 000088dd 248 FUNC GLOBAL DEFAULT 13 _ZN11AccelSensorC2EP13Sen
187: 00014220 4 OBJECT GLOBAL DEFAULT 23 _ZN7android9SingletonI11s
188: 0000a53b 46 FUNC GLOBAL DEFAULT 13 _ZN18CalibrationManager10
189: 00007775 56 FUNC GLOBAL DEFAULT 13 _ZN15ProximitySensorD1Ev
190: 00014008 136 OBJECT GLOBAL DEFAULT 22 HMI
191: 0000721d 26 FUNC GLOBAL DEFAULT 13 _ZNK11AccelSensor16hasPen
192: 0000d475 16 FUNC WEAK DEFAULT 13 _ZNK7android12SortedVecto
193: 00006dd9 264 FUNC GLOBAL DEFAULT 13 _ZN11LightSensorC2EPc
194: 00006181 48 FUNC GLOBAL DEFAULT 13 _ZN22sensors_poll_context
195: 0000d4fd 48 FUNC GLOBAL DEFAULT 13 _ZN13VirtualSensorD