以编程方式LD_PRELOAD

Programmatically LD_PRELOAD

本文关键字:PRELOAD LD 方式 编程      更新时间:2023-10-16

目前,我有一个应用程序:

execlp(java_exec, java_args, etc, etc);

启动jar文件。

是否有办法也有它前置LD_PRELOAD="mylib.so" ?

我找不到一个方法告诉execlp做:LD_PRELOAD="mylib.so" java -jar foo.jar

任何想法我怎么能实现这在C或c++在Linux上?

您可能应该将LD_PRELOAD=mylib.so添加到*envp, execlpe()的第四个参数

该命令可以在LD_PRELOAD变量中附加用户soset LD_PRELOAD=$LD_PRELOAD;"mylib.so"系统命令可用于在C文件

中设置此参数。

在大多数情况下,您可以在execlp(3)之前使用putenv(3)(可能使用snprintf(3)或asprintf(3)…)。例如:

char buf[64];
memset (buf, 0, sizeof(buf));
snprintf (buf, sizeof(buf), "LD_PRELOAD=%s", yourlibso);
putenv(buf);

和之后的execlp ....

然而,putenvsnprintf都可能失败(或者有奇怪的行为,如果yourlibso碰巧包含一个长的字符串)。

你可以在yourlibso之前测试access(2)或stat(2)是否足够好。

处理每一个失败都是困难的。

参见syscalls(2)和errno(3)。

如果在编译时知道yourlibso,事情就简单多了。参见C标准草案,如n2573,或c++标准草案,如n3337。

任何想法我怎么能实现这在C或c++在Linux上?

请记住C和c++是不同的编程语言。