为了测试 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中的结构中添加一个字段.例如,我有以下结构.
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例如内部的字段?
可能重复:
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运行该程序.我的程序会使用第二个定义还是原始定义.
我尝试使用shm_open和mmap共享内存.但是,每当我尝试写入该内存时,都会出现总线错误.极简主义示例代码如下.这里有什么问题,如何解决?
#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)
我得到的输出如下 …
我有以下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) 我正在一台机器上编译一个程序,并在另一台没有兼容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)
我怎么解决这个问题?
我需要以常数的形式保存程序中每个函数的一些信息.我想知道是否可以在代码存储器中将函数的常量放在它之前,因此如果通过函数指针调用函数,则可以通过减去函数指针的值来读取该信息.
为了进一步说明,我的代码存储器应如下所示.
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.使用结构对于编译器传递来说太麻烦了,因为它必须修改很多代码.
在执行我的Spark程序期间,有时(它的原因对我来说仍然是个谜)纱线杀死容器(执行器),给出了超出内存限制的消息.虽然Spark通过生成一个新容器重新执行任务,但我的程序确实恢复了.但是,在我的程序中,任务还会在磁盘上创建一些中间文件.当一个容器被杀死时,这些文件就会被遗忘.有没有办法我可以捕获执行程序 - 作为异常被杀死,以便我可以删除留下的中间文件.显然,异常处理代码也需要在运行执行程序的同一节点上运行,以便我可以从那里删除文件.
如果我输入以下代码,
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)
我怎么解决这个问题?我的意思是,我怎么能够为元组的第二个元素分配一个新值.
基本上,我有一个程序,其输出将输出到stdout。我正在我的Scala代码中运行该程序。我现在要做的是将输出重定向到文件。这样的事情。
val cmd = progName + " " + arguments
cmd #> new java.io.File(outputFilePath) !
Run Code Online (Sandbox Code Playgroud)
我还必须稍后处理该输出文件。这就是为什么这种方法很慢的原因,因为我必须首先等待程序完成并将所有内容写入输出文件。我更希望的是流式输出stdout的内容,以便在流式传输时可以从另一个线程读取内容。这样,我可以在从Scala运行的程序运行时处理数据。
此外,输出文件中的数据由换行符分隔。有没有办法,我可以在程序运行时逐行获取数据。
最后,在Java中有什么可以做的,然后我也可以在Scala中使用?
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