说我有a.so和b.so. 我可以将c.so作为单个共享库与a和b导出的所有函数一起生成,当然可以解析所有的内部依赖关系(即a.so所调用的b.so的所有函数以及相反的方式)?
我试过了
gcc -shared -Wl,soname,c.so -o c.so a.so b.so
但它不起作用.
同样如果我将ao和bo归档为aa和ba(不应该修改ao和bo),并且这样做
gcc -shared -Wl,soname,c.so -o c.so a.a b.a
谢谢
我必须在当前的ubuntu(12.04)上编译程序.然后,该程序应使用具有较旧内核(2.6.18)的CentOS在集群上运行.不幸的是,我不能直接在集群上编译.如果我只是编译并复制程序而没有任何更改,我会收到错误消息"kernel too old".
我理解它的方式,其原因不是内核版本,而是用于编译的libc版本.所以我尝试编译我的程序动态链接集群中的libc并静态链接其他所有内容.
研究
在SO上已经有很多关于这方面的问题,但没有一个答案对我有用.所以这是我对该主题的研究:
-rpath,但是这并没有为我工作(见下文)当前状态
我将以下文件从群集复制到目录中 /path/to/copied/libs
并正在编译选项 -nodefaultlibs -Xlinker -rpath=/path/to/copied/libs -Wl,-Bstatic,-lrt,-lboost_system,-lboost_filesystem -Wl,-Bdynamic,-lc,-lstdc++,-lgcc_s
编译二进制文件的ldd输出是
mybin: /path/to/copied/libs/libc.so.6: version `GLIBC_2.14' not found (required by mybin)
mybin: /path/to/copied/libs/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mybin)
linux-vdso.so.1 => (0x00007ffff36bb000)
libc.so.6 => /path/to/copied/libs/libc.so.6 (0x00007fbe3789a000)
libstdc++.so.6 => /path/to/copied/libs/libstdc++.so.6 (0x00007fbe37599000)
libgcc_s.so.1 => /path/to/copied/libs/libgcc_s.so.1 (0x00007fbe3738b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbe37bf3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe37071000)
Run Code Online (Sandbox Code Playgroud)
我对这个错误感到有些困惑,因为它使用了正确的路径(即集群中的libc),但仍然抱怨缺少glibc版本.在群集上运行ldd时,它返回not a dynamic executable并运行二进制文件会产生上述相同的两个错误.它看起来还包括其他库(linux-vdso.so.1,ld-linux-x86-64.so.2和libm.so.6).我也应该使用旧版本吗? …
我只是好奇.我创建了一个共享对象:
gcc -o liba.so -fPIC -shared liba.c
Run Code Online (Sandbox Code Playgroud)
还有一个共享对象,它与前者相关联:
gcc -o libb.so -fPIC -shared libb.c liba.so
Run Code Online (Sandbox Code Playgroud)
现在,在创建链接的可执行文件时libb.so,我必须指定-rpath-link to ld,以便在发现liba.so时可以找到它libb.so依赖于它:
gcc -o test -Wl,-rpath-link,./ test.c libb.so
Run Code Online (Sandbox Code Playgroud)
否则ld会抱怨.
为什么,ld必须能够liba.so在链接时找到test?因为对我而言,似乎ld在确认liba.so存在方面做的事情并不多.例如,根据需要readelf --dynamic ./test只运行列表libb.so,所以我想动态链接器必须发现libb.so -> liba.so它自己的依赖关系,并使它自己搜索liba.so.
我在x86-64 GNU/Linux平台上,而main() - 例程在test调用函数libb.so时依次调用函数liba.so.
我正在尝试编写cmake规则来使用linux上的boost.python为python构建动态加载库.我想将'foo'用于python模块名称.因此,必须调用库foo.so.但是默认情况下,cmake使用标准规则进行库命名,所以如果我写的话
add_library(foo foo.cpp)
Run Code Online (Sandbox Code Playgroud)
我会得到libfoo.so输出.甚至set_target_properties(foo PROPERTIES OUTPUT_NAME "foobar")
会创造libfoobar.so.
如何改变这种行为?
我是共享库如何在linux上工作的菜鸟.我试图了解应用程序如何在Linux上运行时解析同一共享库的不同修订版.
据我所知,共享库有三个"名称",例如,
通过LDCONFIG安装库时,它将创建以下符号链接
现在假设我使用以下实名libmy.so.2.0编译同一个库的另一个版本.指南中的SONAME是libmy.so.2.0
在应用程序链接时,我将使用"-l"标志提供什么链接器名称.按照我阅读的指南(http://www.dwheeler.com/program-library/Program-Library-HOWTO/x36.htm l),它不一定是libmy.so,如果是这样,两个版本将如何obj文件的区别?
有没有办法知道从dllpython外部函数库导出哪些函数ctypes?
如果可能的话,通过c了解有关导出函数的详细信息types.
如果是,有人可以提供一小段代码吗?
当我拆卸我的小功能时,我碰巧看到了这个电话
call 0xf60d2f47 <__i686.get_pc_thunk.bx>.
Run Code Online (Sandbox Code Playgroud)
我不知道为什么我需要在我的程序中调用此函数.任何解释都会有所帮助.
backtrace函数给出一组回溯如何用函数名/文件名/行号映射它?
for ex:-
backtrace() returned 8 addresses
./libtst.so(myfunc5+0x2b) [0xb7767767]
./libtst.so(fun4+0x4a) [0xb7767831]
./libtst.so(fun3+0x48) [0xb776787f]
./libtst.so(fun2+0x35) [0xb77678ba]
./libtst.so(fun1+0x35) [0xb77678f5]
./a.out() [0x80485b9]
/lib/libc.so.6(__libc_start_main+0xe5) [0xb75e9be5]
./a.out() [0x80484f1]
Run Code Online (Sandbox Code Playgroud)
从上面的堆栈我怎样才能获得文件名和行号?我做了以下事情,但没有运气.如果我错了,请纠正我:)
for ex:-
./libtst.so(fun2+0x35) [0xb77dc887]
0xb77dc887(fun2 addr+offset)-0xb77b6000 (lib starting addr) = 0x26887 (result)
result is no way related to function in nm output.
I used addr2line command:-
addr2line -f -e libtst.so 0xb77dc887
??
??:0
Run Code Online (Sandbox Code Playgroud)
那么,我如何在运行时或运行后解析?提前致谢...
nm:-
00000574 T _init
00000680 t __do_global_dtors_aux
00000700 t frame_dummy
00000737 t __i686.get_pc_thunk.bx
0000073c T myfunc5
000007e7 T fun4
00000837 T fun3 …Run Code Online (Sandbox Code Playgroud) 我刚刚安装了最新的SDK(10.0.10586.0),并想知道我是否可以从旧的Windows 10 SDK(10.0.10240.0和10.0.10150.0)中删除这些库?
或者有安全的方法或程序来做到这一点?
我们最近被要求发布我们的一个库的Linux版本,以前我们在Linux下开发并发布用于Windows,其中部署库通常要容易得多.我们遇到的问题是将导出的符号剥离到只有暴露界面中的符号.想要这样做有三个很好的理由
举一个简单的例子:
TEST.CPP
#include <cmath>
float private_function(float f)
{
return std::abs(f);
}
extern "C" float public_function(float f)
{
return private_function(f);
}
Run Code Online (Sandbox Code Playgroud)
用(g ++ 4.3.2,ld 2.18.93.20081009)编译
g++ -shared -o libtest.so test.cpp -s
Run Code Online (Sandbox Code Playgroud)
用符号检查符号
nm -DC libtest.so
Run Code Online (Sandbox Code Playgroud)
给
w _Jv_RegisterClasses
0000047c T private_function(float)
000004ba W std::abs(float)
0000200c A __bss_start
w __cxa_finalize
w __gmon_start__
0000200c A _edata
00002014 A _end
00000508 T _fini
00000358 T _init
0000049b T public_function
Run Code Online (Sandbox Code Playgroud)
显然不足.接下来我们重新宣布公共职能为
extern "C" float __attribute__ ((visibility ("default")))
public_function(float f)
Run Code Online (Sandbox Code Playgroud)
并编译
g++ …Run Code Online (Sandbox Code Playgroud)