在编写好一个模块的雏形后,和pa一起编译没有什么问题,但是独立编译后的模块(.so),总是无法加载成功, ltdl_open失败。
我在解决这个问题的时候,大部分精力消耗在各个问题孤立的分析与孤立的尝试过程中。这样就不可避免的认为自己一部分正确的工作是错误的。
后来发现有些函数我用了,但是在库里面是local。这也会导致ltdl_open打开失败。
1. libpulse的local限制
代码里面使用了pa_operation_done, pa_operation_new.
看看map-file会发现,pa_operation_new, pa_operation_done没有被定义为global.
定义重新编译后可以。
这也是我比较迷惑的问题,既然这两个函数是local的,外部不能直接用, 居然编译不出错。
2. 动态库的search path引起的问题。
可以看到pulseaudio内建模块和我们独立编译模块的区别。
当然,如果我们不想或者不能设置rpath了,我们可以设置LD_LIBRARY_PATH来解决这个search path的问题。
这个默认的path里面包含了/usr/lib, 这就是为什么我修改Makefile.am使得libprotocol-native安装到/usr/lib可以解决问题的原因。
附
最初的module-audiomanager和pulseaudio系统内建的 module-stream-restore的区别在rpath上
[sbox-alp-x86-rel-prod: ~/dev/ALP/main/open-source/pulseaudio-0.9.21/dist] > readelf -d /usr/lib/pulse-0.9.21/modules/module-stream-restore.so
Dynamic section at offset 0x63fc contains 33 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libprotocol-native.so]
0x00000001 (NEEDED) Shared library: [libpulsecore-0.9.21.so]
0x00000001 (NEEDED) Shared library: [libltdl.so.7]
0x00000001 (NEEDED) Shared library: [libspeexdsp.so.1]
0x00000001 (NEEDED) Shared library: [libpulse.so.0]
0x00000001 (NEEDED) Shared library: [libpulsecommon-0.9.21.so]
0x00000001 (NEEDED) Shared library: [libsndfile.so.1]
0x00000001 (NEEDED) Shared library: [librt.so.1]
0x00000001 (NEEDED) Shared library: [libdl.so.2]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000e (SONAME) Library soname: [module-stream-restore.so]
0x0000000f (RPATH) Library rpath: [/usr/lib/pulse-0.9.21/modules]
0x0000000c (INIT) 0x1798
0x0000000d (FINI) 0x5704
0x00000004 (HASH) 0xb4
0x00000005 (STRTAB) 0xa38
0x00000006 (SYMTAB) 0x3d8
0x0000000a (STRSZ) 2313 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000003 (PLTGOT) 0x7538
0x00000002 (PLTRELSZ) 696 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x14e0
0x00000011 (REL) 0x1480
0x00000012 (RELSZ) 96 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0x1410
0x6fffffff (VERNEEDNUM) 3
0x6ffffff0 (VERSYM) 0x1342
0x6ffffffa (RELCOUNT) 7
0x00000000 (NULL) 0x0
[sbox-alp-x86-rel-prod: ~/dev/ALP/main/open-source/pulseaudio-0.9.21/dist] > readelf -d /usr/lib/pulse-0.9.21/modules/module-audiomanager.so
Dynamic section at offset 0x83c4 contains 27 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libpulse.so.0]
0x00000001 (NEEDED) Shared library: [libpulsecommon-0.9.21.so]
0x00000001 (NEEDED) Shared library: [libpulsecore-0.9.21.so]
0x00000001 (NEEDED) Shared library: [libprotocol-native.so]
0x00000001 (NEEDED) Shared library: [libglib-2.0.so.0]
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000e (SONAME) Library soname: [module-audiomanager.so]
0x0000000c (INIT) 0x1604
0x0000000d (FINI) 0x6de4
0x00000004 (HASH) 0xb4
0x00000005 (STRTAB) 0x9e8
0x00000006 (SYMTAB) 0x3c8
0x0000000a (STRSZ) 2061 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000003 (PLTGOT) 0x9504
0x00000002 (PLTRELSZ) 504 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x140c
0x00000011 (REL) 0x132c
0x00000012 (RELSZ) 224 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0x12bc
0x6fffffff (VERNEEDNUM) 3
0x6ffffff0 (VERSYM) 0x11f6
0x6ffffffa (RELCOUNT) 10
0x00000000 (NULL) 0x0