目前,我有一个应用程序:
execlp(java_exec, java_args, etc, etc);
启动一个jar文件。
有没有办法让它前置LD_PRELOAD="mylib.so"
?
我无法找到告诉execlp
的方法:LD_PRELOAD="mylib.so" java -jar foo.jar
如何在Linux上用C或C ++实现这一目标?
答案 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
....
但是,putenv
和snprintf
都可能失败(或者,如果yourlibso
恰好包含 long 字符串,则行为可能很怪异)。
您可能会先测试yourlibso
与access(2)或stat(2)是否足够。
处理每个失败都很困难。
请参见syscalls(2)和errno(3)。
在编译时知道yourlibso
时,事情要简单得多。请参阅诸如n2573之类的C标准草案,或诸如n3337之类的C ++标准草案。
有什么想法可以在Linux上用C或C ++实现吗?
答案 2 :(得分:-1)
此命令可用于在LD_PRELOAD变量中附加用户.so
set LD_PRELOAD=$LD_PRELOAD;"mylib.so"
系统命令可用于从C文件