【问题标题】:ERROR: ld.so: object 'getpid.so' from LD_PRELOAD cannot be preloaded: ignored错误:ld.so:无法预加载来自 LD_PRELOAD 的对象“getpid.so”:忽略
【发布时间】:2012-01-18 10:11:47
【问题描述】:

当我尝试如下使用 LD_PRELOAD 时,

LD_PRELOAD=getpid.so ./testpid

我收到以下错误...

ERROR: ld.so: object 'getpid.so' from LD_PRELOAD cannot be preloaded: ignored.

我使用

编译 getpid.so
gcc -Wall -fPIC -shared -o getpid.so getpid.c

它包含以下代码...

// 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);
}

tespid.c 包含使用 getpid 的代码,如下所示,并通过执行

gcc testpid -o testpid.c

这可能是什么问题?为什么 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;
}

【问题讨论】:

    标签: c linux dynamic x86-64


    【解决方案1】:

    加载器似乎无法找到 getpid.so,因为您没有提到库的路径。

    试试:

    LD_PRELOAD=/full/path/to/getpid.so ./testpid
    

    【讨论】:

    • 非常真实!而不是 LD_PRELOAD=getpid.so ./testpid,它应该是 LD_PRELOAD=./getpid.so ./testpid。现在它的工作。
    • 在我的情况下,我还必须设置 LD_LIBRARY_PATH 并获得 64 位版本的库。
    【解决方案2】:

    我也遇到如下错误

    ERROR: ld.so: object '/usr/lib64/libjemalloc.so.1' from LD_PRELOAD cannot be preloaded
    

    以下是我的步骤为我解决了错误。

    转到路径 /usr/lib64 并使用以下命令查找 libjemalloc*

      #cd /usr/lib64
      #ls | grep libjemalloc
    

    如果您没有发现您的系统中没有安装该软件包

      $sudo yum whatprovides libjemalloc*
      $sudo yum install jemalloc-3.6.0-1.amzn2.x86_64
    

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 2013-07-17
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多