错误:ld.so:LD_PRELOAD中的对象'getpid.so'无法预加载:忽略

Met*_*est 12 c linux x86-64 dynamic

当我尝试使用LD_PRELOAD时,如下

LD_PRELOAD=getpid.so ./testpid
Run Code Online (Sandbox Code Playgroud)

我收到以下错误...

ERROR: ld.so: object 'getpid.so' from LD_PRELOAD cannot be preloaded: ignored.
Run Code Online (Sandbox Code Playgroud)

我使用编译getpid.so

gcc -Wall -fPIC -shared -o getpid.so getpid.c
Run Code Online (Sandbox Code Playgroud)

它包含以下代码......

// getpid.c
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

pid_t getpid(void)
{
    printf("Hello, world!\n");
    return syscall(SYS_getpid);
}
Run Code Online (Sandbox Code Playgroud)

tespid.c 使用getpid的constains代码,如下所示,并通过执行编译

gcc testpid -o testpid.c
Run Code Online (Sandbox Code Playgroud)

这可能是什么问题?为什么LD_PRELOAD不起作用?

// testpid.c
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    printf( "pid = %d!\n", getpid() );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

cod*_*ict 20

看起来加载器无法找到,getpid.so因为您没有提到库的路径.

尝试:

LD_PRELOAD=/full/path/to/getpid.so ./testpid
Run Code Online (Sandbox Code Playgroud)

  • 非常真实!它不应该是LD_PRELOAD = getpid.so ./testpid,而应该是LD_PRELOAD =./ getpid.so ./testpid.现在它的工作. (3认同)
  • 在我的情况下,我还必须设置`LD_LIBRARY_PATH`并获得该库的64位版本. (2认同)