以编程方式LD_PRELOAD

时间:2014-08-01 09:30:34

标签: c++ c linux

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

execlp(java_exec, java_args, etc, etc);

启动一个jar文件。

有没有办法让它前置LD_PRELOAD="mylib.so"

我无法找到告诉execlp的方法:LD_PRELOAD="mylib.so" java -jar foo.jar

如何在Linux上用C或C ++实现这一目标?

3 个答案:

答案 0 :(得分:2)

您可能应该将install:generatepackagestates添加到task('typo3:packagestates', function (): void { cd('{{release_path}}'); add('env', [ 'TYPO3_PATH_APP' => '', 'TYPO3_PATH_COMPOSER_ROOT' => '', 'TYPO3_PATH_ROOT' => '', 'TYPO3_PATH_WEB' => '', ]); run('{{bin/php}} {{bin/typo3cms}} install:generatepackagestates'); })->local(); after('deploy:vendors', 'typo3:packagestates'); 的第四个参数LD_PRELOAD=mylib.so中。

答案 1 :(得分:0)

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

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

然后是您的execlp ....

但是,putenvsnprintf都可能失败(或者,如果yourlibso恰好包含 long 字符串,则行为可能很怪异)。

您可能会先测试yourlibsoaccess(2)stat(2)是否足够。

处理每个失败都很困难。

请参见syscalls(2)errno(3)

在编译时知道yourlibso时,事情要简单得多。请参阅诸如n2573之类的C标准草案,或诸如n3337之类的C ++标准草案。

有什么想法可以在Linux上用C或C ++实现吗?

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

答案 2 :(得分:-1)

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

设置此命令