我知道使用ldconfig和LD_LIBRARY_PATH的一般基础知识,但我希望能得到一些大师的帮助来解决我的情况。我有一个可移植的软件包,它位于自己的目录中,许多库都有自己的版本。有很多二进制文件和脚本从这个目录运行。一些二进制文件(apache、php、postgres)也可能在系统上安装了单独的版本。由于php可能有两个版本,如果系统无法判断是哪个版本,创建/etc/ld.so.conf.d/myapp.conf是不够的“myapp”使用ldconfig文件。我正在寻找配置此类系统的最佳实践。最初设置软件包的人导出了LD_LIBRARY_PATH,以便系统上的所有应用程序都使用
我有一个共享库(libtest.cpp)和一个简单程序(test.cpp)。我希望他们共享一个线程局部变量gVar。共享库通过LD_PRELOAD链接。这是共享库libtest.cpp的代码:#include__threadintgVar;voidprint_gVar(){printf("%d\n",gVar);}下面是test.cpp的代码。#include__threadintgVar;void__attribute__((weak))print_gVar();intmain(){gVar=10;print_gVar();return0;}然后我使用以下脚本来编译和运行它们。g++
我有一个共享库(libtest.cpp)和一个简单程序(test.cpp)。我希望他们共享一个线程局部变量gVar。共享库通过LD_PRELOAD链接。这是共享库libtest.cpp的代码:#include__threadintgVar;voidprint_gVar(){printf("%d\n",gVar);}下面是test.cpp的代码。#include__threadintgVar;void__attribute__((weak))print_gVar();intmain(){gVar=10;print_gVar();return0;}然后我使用以下脚本来编译和运行它们。g++
这是我使用LD_PRELOAD包装函数的模板:intgettimeofday(structtimeval*tv,structtimezone*tz){staticint(*gettimeofday_real)(structtimeval*tv,structtimezone*tz)=NULL;if(!gettimeofday_real)gettimeofday_real=dlsym(RTLD_NEXT,"gettimeofday");returngettimeofday_real(tv,tz);}我意识到ioctl似乎具有以下签名:intioctl(intd,unsignedlongre
这是我使用LD_PRELOAD包装函数的模板:intgettimeofday(structtimeval*tv,structtimezone*tz){staticint(*gettimeofday_real)(structtimeval*tv,structtimezone*tz)=NULL;if(!gettimeofday_real)gettimeofday_real=dlsym(RTLD_NEXT,"gettimeofday");returngettimeofday_real(tv,tz);}我意识到ioctl似乎具有以下签名:intioctl(intd,unsignedlongre
我有一个用nasm编译的示例程序集文件:nasm-felfsyscall.asm这会生成一个syscall.o文件。我尝试将其与ld链接:ld-osyscallsyscall.old命令失败并出现以下错误:ld:i386architectureofinputfile`syscall.o'isincompatiblewithi386:x86-64output但是,如果我这样做ld-osyscallsyscall.o-melf_i386命令成功,我得到一个系统调用可执行文件。发现nasm没有生成x86-64格式的目标代码,我在syscall.asm文件的开头添加了“BITS64”指令。然后
我有一个用nasm编译的示例程序集文件:nasm-felfsyscall.asm这会生成一个syscall.o文件。我尝试将其与ld链接:ld-osyscallsyscall.old命令失败并出现以下错误:ld:i386architectureofinputfile`syscall.o'isincompatiblewithi386:x86-64output但是,如果我这样做ld-osyscallsyscall.o-melf_i386命令成功,我得到一个系统调用可执行文件。发现nasm没有生成x86-64格式的目标代码,我在syscall.asm文件的开头添加了“BITS64”指令。然后
在我的自定义环境中,预加载了一个拦截器库,它运行bind()、connect()等调用的特殊实现。我看到的问题是,每当应用程序使用命令setcap显式启用功能时,执行应用程序无法预加载拦截器库并调用默认libcconnect()。这是预期的行为吗?如果是,禁用LD_PRELOAD的原因可能是什么?是否有任何调整或方法可以用来成功预加载启用功能的库? 最佳答案 就像OliverMatthews回答的那样,出于安全原因,LD_PRELOAD对于setuid二进制文件和具有文件功能的二进制文件都被禁用。要在启用文件功能的同时预加载库,您有
在我的自定义环境中,预加载了一个拦截器库,它运行bind()、connect()等调用的特殊实现。我看到的问题是,每当应用程序使用命令setcap显式启用功能时,执行应用程序无法预加载拦截器库并调用默认libcconnect()。这是预期的行为吗?如果是,禁用LD_PRELOAD的原因可能是什么?是否有任何调整或方法可以用来成功预加载启用功能的库? 最佳答案 就像OliverMatthews回答的那样,出于安全原因,LD_PRELOAD对于setuid二进制文件和具有文件功能的二进制文件都被禁用。要在启用文件功能的同时预加载库,您有
运行Ubuntu10.04$uname-aLinuxminion2.6.32-36-generic-pae#79-UbuntuSMPTueNov823:25:26UTC2011i686GNU/Linux下载源代码并执行以下操作:CFLAGS="-O2-U_FORTIFY_SOURCE-fno-stack-protector"'/home/user/Desktop/eglibc-2.11.1/configure'--prefix='/home/user/Desktop/eglibc_pristinebuild'make-j4exportLD_LIBRARY_PATH=/lib/tls/i