如何以与 SONAME 冲突的库的两个现有版本兼容的方式链接二进制文件?这两个版本不共享相同的 SONAME 前缀。一个是 libcapi10.so.3,另一个是 libcapi10.so.4。我无法重新编译它们,因为我将它们作为二进制文件,而且由于这些是经过认证的加密库,我无法使用正确的 SONAME 请求新的库。当然,如果一个是 libcap10.so.3 和另一个 libcap10.so.3.1,我不会遇到任何问题,因为我只需要链接第一个以与第二个兼容。这两个库被告知是二进制兼容的(我应该相信这个信息)。我搜索但没有找到任何好的方法,无论是使用链接器选项还是使用 objcopy。我想避免手动修补二进制文件以在编译链接时使用它。
所以回到我最初的问题:如何指定 SONAME(在本例中为 libcap10.so)用于链接?
(我已经搜索过了,我目前的发现只是它是行不通的,但不幸的是这是一个要求......)。
更新:我使用类似于 sed 的二进制工具修补了 .so 库,将 libcapi10.so.6\0 替换为 libcapi10.so\0,这是因为新名称比以前短并且 SONAME 的 elf 结构是以 C 字符串结尾的带有 0 并且在 gcc 链接期间不使用精灵校验和。我仅在编译时使用该修补库,然后我可以在目标系统上使用一个或另一个具有相同二进制文件的原始库。
我有以下顺序
可执行(主)----(dlopen)---> libapp.so ---(动态链接)--> libfoo.so
libfoo.so 反过来动态链接到 libfoo_strong.so。libfoo.so 从 libfoo_strong.so 调用一个函数,但也有一个弱定义(在编译成 libfoo.so 的 foo.c 中)。
现在,libapp.so 从 libfoo.so 调用一个函数(比如 invoke_foo_func_ptr() 并且这个函数>调用一个函数指针,它存储定义为弱的符号。我的期望是 >invokes_foo_func_ptr 调用强符号,但它总是到弱符号。请参阅下面的>代码了解详细信息。
PS:不要让我解释特定执行顺序的原因,但我对>变通办法持开放态度。
foo_strong.c --> gcc -g -fPIC -shared -rdynamic foo_strong.o -o libfoo_strong.so
foo.c: --> gcc -g -fPIC -shared -rdynamic -L/users/ardesiga/cprogs/ld_r foo.o -o libfoo.so
app.c: --> gcc -g -fPIC -shared -rdynamic -L/users/ardesiga/cprogs/ld_r -lfoo -lfoo_strong app.o -o > libapp.so
/* foo_strong.c */
int
foo_weak_func (char *msg)
{
printf("[%s:%s] Reached strong, with msg: %s\n", __FILE__, __FUNCTION__, msg);
}
/* foo.c */ …Run Code Online (Sandbox Code Playgroud) 考虑下面列出的两个文件:
文件 a.c
extern int foovar;
int foobarize() {
return foovar * foovar;
}
Run Code Online (Sandbox Code Playgroud)
和文件 b.c
int foovar = 10;
Run Code Online (Sandbox Code Playgroud)
我编译静态库liba.a和共享库libb.so如下:
# liba.a
gcc -fPIC -c a.c -o a.o
ar cr liba.a a.o
ranlib liba.a
# libb.so
gcc -fPIC -c b.c -o b.o
gcc -fPIC -shared -Wl,-soname,libb.so -o libb.so b.o liba.a
Run Code Online (Sandbox Code Playgroud)
请注意该函数foobarize的定义a.c 是存在的liba.a,但它不存在libb.so。我可以通过发布nm程序来保证:
$ nm liba.a
a.o:
0000000000000000 T foobarize
U foovar
U _GLOBAL_OFFSET_TABLE_ …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 libusb 构建为共享库,如下所示。
以下是两个步骤。1. 配置 2. 制作。
我通过“--enable-shared”来配置脚本,假设它将生成共享的 .so 文件
./configure CC=/mnt/store/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-gcc --host=arm-linux --enable-udev=no --enable-shared
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-linux-strip... no
checking for strip... strip
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether make supports nested variables... (cached) yes …Run Code Online (Sandbox Code Playgroud) 当我尝试动态加载这样的共享 PHP 库时
dl('libmegaphp.so');
Run Code Online (Sandbox Code Playgroud)
我收到这个错误
PHP 警告:dl():动态加载的扩展在
在这里, FFmpeg 中的新功能。我在 FFmpeg 的控制台中使用和测试。
我已经完成了 2 个视频加入交叉淡入淡出这个问题:我正在为 5 个视频合并交叉淡入淡出我刚刚完成了 90% 的合并我只需要管理 setpts=PTS-STARTPTS 看看这个请。
ffmpeg -i big_buck.mp4 -i big_buck.mp4 -i big_buck.mp4 -i big_buck.mp4 -i
big_buck.mp4 -filter_complex "[0:v]trim=0:4,setpts=PTS-
STARTPTS,fade=out:st=4:d=1:alpha=1[1]; [1:v]trim=1:4,setpts=PTS-
STARTPTS,format=yuva420p,fade=in:st=0:d=1:alpha=1,fade=out:st=4:d=1:alpha=1[2];
[2:v]trim=1:4,setpts=PTS-
STARTPTS,format=yuva420p,fade=in:st=0:d=1:alpha=1,fade=out:st=4:d=1:alpha=1[3];
[3:v]trim=1:4,setpts=PTS-
STARTPTS,format=yuva420p,fade=in:st=0:d=1:alpha=1,fade=out:st=4:d=1:alpha=1[4];
[4:v]trim=1:4,setpts=PTS-STARTPTS,format=yuva420p,fade=in:st=0:d=1:alpha=1[5];
[1][2]overlay,format=yuv420p[12]; [12][3]overlay,format=yuv420p[123]; [4]
[5]overlay,format=yuv420p[45]; [123][45]concat=n=2 [v]" -map [v] result.mp4
Run Code Online (Sandbox Code Playgroud)
****请注意,每个输入视频 big_buck.mp4 长度为 5 秒 ****。现在 在代码中看到setpts=PTS-STARTPTS如何在每个视频输入中管理它????
我也在各种论坛上看到过,但我没有找到!!!谢谢
在构建既静态和共享库的cmake上的Windows我不得不追加“-static”的静态库名(在Windows中,静态的共享库可以有.LIB扩展名),所以产生的文件名的静态库LIB是lib-static.lib。在任何正在运行的系统上,如何使用automake + libtool(即指示libtool将“ -static ” 附加到生成的静态库文件名之后)来实现它?
我从一个示例中的类创建一个共享库,我在这里获得了Linux上的C ++动态共享库。我想从创建的共享库中调用另一个共享库,然后在主程序中使用它。因此,我有myclass.so库,我想从myclass.so库中调用另一个库,例如anotherclass.so,然后在主程序中使用此myclass.so库。请问我如何做到这一点。
我有来自Google Play服务的应用的崩溃报告,如下所示:
backtrace:
#00 pc 00000000001b46a0 library.so
#01 pc 0000000000604464 library.so
#02 pc 0000000000c8ed1c library.so
Run Code Online (Sandbox Code Playgroud)
我还有一个.map文件library.so,帮助我找到函数名称并将堆栈跟踪转换为更易读的格式:
backtrace:
#00 pc 00000000001b46a0 library.so foo()
#01 pc 0000000000604464 library.so bar()
#02 pc 0000000000c8ed1c library.so zoo()
Run Code Online (Sandbox Code Playgroud)
但是手动解析函数名是容易出错的,它不会给我行号是导致崩溃的源代码.
我考虑过library.so在发布新版本时存储未剥离版本的想法,以便我可以使用ndk-stack工具,但剥离和未剥离二进制文件的AFAIK函数地址是不同的.
所以我的问题是可以继续发布剥离的二进制文件,并有办法自动用行号来表示堆栈跟踪吗?
任何建议将不胜感激
当可以从多个线程访问/更新变量时,通常需要保护它免受同时更改的影响。一种有效的方法是使用原子函数来保证互斥访问。例如(sb-ext:atomic-incf *count*)。另一种方法是像这样围绕更新操作包装一个锁(bt:with-lock-held (*lock*) (incf *count*)),但这有点昂贵。
有没有一种有效的方法可以在多线程代码中包含库函数(例如来自亚历山大图书馆)?例如,如果 (alexandria:deletef x *list*)要从多个线程中执行操作?还是需要锁?(ps:我假设a deletef需要保护,但不能完全确定。)
shared-libraries ×10
linux ×3
android ×2
autotools ×2
c ×2
c++ ×2
gcc ×2
linker ×2
android-ndk ×1
c++11 ×1
common-lisp ×1
dlopen ×1
ffmpeg ×1
ld ×1
libusb-1.0 ×1
locking ×1
php ×1
video ×1
windows ×1