LD_PRELOAD を使用していますが、system() コマンドを使用すると、bash とダッシュの違いが見られます。
この単純な C プログラムを考えてみましょう。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
system("echo $LD_PRELOAD > /tmp/blah.txt");
return 0;
}
次のようにテストプログラムを開始します。
LD_PRELOAD=preload.so ./test
bashとdashの両方で、次のようになりました:
~$ cat /tmp/blah.txt
preload.so
これまでのところ、dash がシェルの場合にシステムに与えられたコマンドに LD_PRELOAD が適用されないことを除けば、これで問題ありません。つまり
- /bin/sh が /bin/bash を指している場合、system() に指定されたコマンドに LD_PRELOAD が適用されます。
- /bin/sh が /bin/dash を指している場合、LD_PRELOAD は system() に指定されたコマンドに適用されません。
私の preload.so ライブラリは open() をオーバーライドします。bash を使用する場合 (/bin/sh=/bin/bash) はテスト プログラムで実行されますが、dash を使用する場合 (/bin/sh=/bin/dash) は実行されません。
bash と dash は、execve に渡される環境変数を異なる方法で処理する可能性があると推測していますが、dash を使用して、システムに指定されたコマンドに LD_PRELOAD を適用する方法を見つけることができません... 残念ながら、dash を使用する必要があり、bash を使用するのはオプションではありません。