小编pyt*_*nic的帖子

LD_PRELOAD 不适用于我的程序

为了测试 LD_PRELOAD,我编写了自己的getpid,它在getpid使用 dlsym调用原始文件之前打印了一些东西。代码如下。

#define _GNU_SOURCE

#include <unistd.h>
#include <stdio.h>
#include <dlfcn.h>

typedef pid_t (*getpidType)(void);

pid_t getpid(void)
{
    printf("Hello, getpid!\n");
    getpidType f = (getpidType)dlsym(RTLD_NEXT, "getpid");
    return f();
}
Run Code Online (Sandbox Code Playgroud)

但是,当我getpid在我的程序中使用它并使用 LD_PRELOAD 运行它时,通过键入LD_PRELOAD=./prelib.so ./prog,我收到以下错误。

./prog: symbol lookup error: ./prelib.so: undefined symbol: dlsym
Run Code Online (Sandbox Code Playgroud)

但是如果我这样做LD_PRELOAD=./prelib.so bash -c 'echo $$',就没有这样的错误。知道这里发生了什么。

c linux gcc x86-64 ld-preload

2
推荐指数
1
解决办法
2349
查看次数

这个技巧会在C中发挥作用吗?

我想在C中的结构中添加一个字段.例如,我有以下结构.

struct A
{
 some_type x;
 some_type y;
}
Run Code Online (Sandbox Code Playgroud)

我声明了一个像这样的新结构.

struct B
{
 A a;
 some_type z;
}
Run Code Online (Sandbox Code Playgroud)

现在说我有这样的功能.

int some_function( A * a )
Run Code Online (Sandbox Code Playgroud)

是否可以在程序中将类型B的变量传递给它.

B * b;
......
A * a = (A*)b;
some_function( a );
Run Code Online (Sandbox Code Playgroud)

并且还可以some_function使用a->x例如内部的字段?

c

2
推荐指数
1
解决办法
353
查看次数

可以使用LD_PRELOAD更改结构吗?

可能重复:
LD_PRELOAD是否可以使用不同参数的函数?

我有一个结构,我们称之为my_struct,声明如下.

struct my_struct
{
 int a;
 int b;
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我想为它添加一个新字段,所以我想按如下方式更改它.

struct my_struct
{
 int a;
 int b;
 int c;
}
Run Code Online (Sandbox Code Playgroud)

假设我在我的共享对象库中执行此操作,然后我将LD_PRELOAD运行该程序.我的程序会使用第二个定义还是原始定义.

c linux gcc

2
推荐指数
1
解决办法
166
查看次数

尝试写入共享内存时出现总线错误

我尝试使用shm_openmmap共享内存.但是,每当我尝试写入该内存时,都会出现总线错误.极简主义示例代码如下.这里有什么问题,如何解决?

#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// compile with -lrt

char fname[64];
int fd;

int main()
{
    int * sm;
    sprintf( fname, "%d_%u", 4, 4 ); 

    if ((fd = shm_open(fname, O_CREAT | O_RDWR, 0777)) == -1)
    {        
        perror(NULL);
        return 0;
    }
    sm = (int*)mmap(0, (size_t)4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, 
      fd, 0);
    printf( "Now trying to see if it works!\n" );
    sm[0] = 42;
    printf( "%d, %d!\n", sm[0], sm[1] );

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

我得到的输出如下 …

c c++ linux x86-64

2
推荐指数
1
解决办法
2093
查看次数

指针立即变为NULL

我有以下LLVM代码.奇怪的是,在if块之外的新指令分配后si,类型的变量StoreInst立即变为null(0),而我已在外部范围声明它.这里发生了什么?

        Value *OldVal = NULL;
        StoreInst* si = NULL;

        if ( ... )
        {
            if ( ... )
            {
                ....

                if ( ... )
                {
                    ...
                    StoreInst* si = new StoreInst(...);
                    errs() << "si = " << si << "\n"; // Get some address here
                }
                errs() << "-->SI = " << si << "\n"; // Here I get NULL, why?
            }
            ...
        }
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出,

si = 0x1822ba0
-->SI = 0x0
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
1
解决办法
494
查看次数

LD_LIBRARY_PATH在LD_PRELOAD正常工作时无法正常工作

我正在一台机器上编译一个程序,并在另一台没有兼容libstdc ++库的机器上运行它.如果我像这样运行它,那就是使用LD_PRELOAD,它运行正常.

LD_PRELOAD=./libstdc++.so.6 ./program args
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用LD_LIBRARY_PATH,如下所示,它不会加载库,我得到的错误是我没有所需的libstdc ++版本.

export LD_LIBRARY_PATH="./libstdc++.so.6"
./program args
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

c c++ linux gcc

2
推荐指数
2
解决办法
4708
查看次数

如何将常量放在代码存储器中

我需要以常数的形式保存程序中每个函数的一些信息.我想知道是否可以在代码存储器中将函数的常量放在它之前,因此如果通过函数指针调用函数,则可以通过减去函数指针的值来读取该信息.

为了进一步说明,我的代码存储器应如下所示.

ConstantForFunc1
Func1:
 ....

ConstantForFunc2
Func2:
 ....
Run Code Online (Sandbox Code Playgroud)

以下是我将如何阅读该信息的示例代码

FuncPointer f = &Func2;
int constantForFunc2 = *((int*)(f - sizeof(int)));
Run Code Online (Sandbox Code Playgroud)

请注意,使用哈希表对于我想要实现的目标来说太慢了,所以我需要一个非常快速的方法.所有这些修改,即插入常量和代码来从中读取,都是通过编译器传递来完成的,我正在编写并修改LLVM IR.使用结构对于编译器传递来说太麻烦了,因为它必须修改很多代码.

c c++ linux x86-64 llvm

2
推荐指数
1
解决办法
195
查看次数

有没有办法在Spark中捕获执行程序被杀死的异常?

在执行我的Spark程序期间,有时(它的原因对我来说仍然是个谜)纱线杀死容器(执行器),给出了超出内存限制的消息.虽然Spark通过生成一个新容器重新执行任务,但我的程序确实恢复了.但是,在我的程序中,任务还会在磁盘上创建一些中间文件.当一个容器被杀死时,这些文件就会被遗忘.有没有办法我可以捕获执行程序 - 作为异常被杀死,以便我可以删除留下的中间文件.显然,异常处理代码也需要在运行执行程序的同一节点上运行,以便我可以从那里删除文件.

bigdata hadoop-yarn apache-spark

2
推荐指数
2
解决办法
1592
查看次数

如何为scala中的元组中的Integer赋值?

如果我输入以下代码,

var x = ("This is driving me nuts!", 38)
x._2 = 58
Run Code Online (Sandbox Code Playgroud)

我收到以下错误.

error: reassignment to val
         x._2 = 58
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?我的意思是,我怎么能够为元组的第二个元素分配一个新值.

scala

2
推荐指数
1
解决办法
134
查看次数

如何在Scala中流式输出stdout?

基本上,我有一个程序,其输出将输出到stdout。我正在我的Scala代码中运行该程序。我现在要做的是将输出重定向到文件。这样的事情。

val cmd = progName + " " + arguments 
cmd #> new java.io.File(outputFilePath) !
Run Code Online (Sandbox Code Playgroud)

我还必须稍后处理该输出文件。这就是为什么这种方法很慢的原因,因为我必须首先等待程序完成并将所有内容写入输出文件。我更希望的是流式输出stdout的内容,以便在流式传输时可以从另一个线程读取内容。这样,我可以在从Scala运行的程序运行时处理数据。

此外,输出文件中的数据由换行符分隔。有没有办法,我可以在程序运行时逐行获取数据。

最后,在Java中有什么可以做的,然后我也可以在Scala中使用?

java scala apache-spark

2
推荐指数
1
解决办法
4482
查看次数

标签 统计

c ×6

linux ×5

c++ ×4

gcc ×3

x86-64 ×3

apache-spark ×2

scala ×2

bigdata ×1

hadoop-yarn ×1

java ×1

ld-preload ×1

llvm ×1