选项 -rdynamic 用来通知链接器将所有符号添加到动态符号表中
(目的是能够通过使用 dlopen 来实现向后跟踪)
-rdynamic
Pass the flag ‘-export-dynamic’ to the ELF linker, on targets that support
it. This instructs the linker to add all symbols, not only used ones, to the
dynamic symbol table. This option is needed for some uses of dlopen or to
allow obtaining backtraces from within a program.
比如日志系统,主程序里使用一套日志系统,dlopen方式打开的libso里无法使用。编译时加上这个参数,不需要增加任何代码就可以使代码通用。
网上搜到上面的说法
没看太明白
是不是可以理解为
我现在有 A.o B.so
然后我可以g++ -rdynamic A.o B.so -shared -o C.so
然后我用C.so的时候 可以不必依赖B.so了?
我试了试 貌似这个选项不生效啊
还是说 对B.so有什么限制?
还是说 只是将符号表全部添加进去 而不是只添加实现的那部分符号表? 这有什么好处?
其实我的需求是这样的
我原来用了开源的ACE 我本机编译时没问题
现在一发布时 我都要写个脚本去创建libACE.conf 指明ACE的路径
我嫌麻烦(自己到是不麻烦,主要是公司实施员工水平不行,经常连脚本都不会运行)
所以我现在期望能程序启动时 直接运行
我代码里有一部分需要使用到ACE 具体的说 就是继承并实现了ACE_Task
这导致我的工程必须在编译时需要 -lACE
有什么办法 能让我运行时 不修改系统任何配置就能加载libACE.so?
我在stackoverflow上问了下 有个回帖的说用-rdynamic 但我试了试 好像只导入符号表 没有把实现链接进去
(目的是能够通过使用 dlopen 来实现向后跟踪)
-rdynamic
Pass the flag ‘-export-dynamic’ to the ELF linker, on targets that support
it. This instructs the linker to add all symbols, not only used ones, to the
dynamic symbol table. This option is needed for some uses of dlopen or to
allow obtaining backtraces from within a program.
比如日志系统,主程序里使用一套日志系统,dlopen方式打开的libso里无法使用。编译时加上这个参数,不需要增加任何代码就可以使代码通用。
网上搜到上面的说法
没看太明白
是不是可以理解为
我现在有 A.o B.so
然后我可以g++ -rdynamic A.o B.so -shared -o C.so
然后我用C.so的时候 可以不必依赖B.so了?
我试了试 貌似这个选项不生效啊
还是说 对B.so有什么限制?
还是说 只是将符号表全部添加进去 而不是只添加实现的那部分符号表? 这有什么好处?
其实我的需求是这样的
我原来用了开源的ACE 我本机编译时没问题
现在一发布时 我都要写个脚本去创建libACE.conf 指明ACE的路径
我嫌麻烦(自己到是不麻烦,主要是公司实施员工水平不行,经常连脚本都不会运行)
所以我现在期望能程序启动时 直接运行
我代码里有一部分需要使用到ACE 具体的说 就是继承并实现了ACE_Task
这导致我的工程必须在编译时需要 -lACE
有什么办法 能让我运行时 不修改系统任何配置就能加载libACE.so?
我在stackoverflow上问了下 有个回帖的说用-rdynamic 但我试了试 好像只导入符号表 没有把实现链接进去