私はLinuxとWindowsの両方で利用可能なコマンドラインプログラム「Whitaker's Words」をダウンロードしました。
というメインプログラムがありますwords
。 Ubuntu(11.10)システムでコマンドラインで実行してみましたが、正常に動作しました。
./words
Linux Webサーバー(Linux 2.6.37-he-xeon-64gb + 1 i686)でテストするときにもうまく機能します。
その後、ソースコードをいくつか変更して再コンパイルすることにしました。これを行うには、次のコマンドを使用しました(最後の4つはサポートプログラムです)。
gnatmake -O3 words -bargs -static
gnatmake makedict -bargs -static
gnatmake makestem -bargs -static
gnatmake makeefil -bargs -static
gnatmake makeinfl -bargs -static
生成されたプログラムは端末で正しい出力を見ることができるため、Ubuntuコンピュータで再び正常に実行されます。
shell_exec()
しかし、PHPを使用したりWebサーバーで実行しようとすると、passthru()
まったく出力はありません!によると、ldd
このプログラムはstatically linked
実際に動作するはずです。そうですか?
数週間テストしてデバッグしてみましたが、理由は見つかりませんでした。助けてください?
ここからプログラムを入手できます。ダウンロードリンクはfiledropper.comにあります。
(私の質問はただ:このプログラムを私のWebサーバーでどのように実行させますか?ですから、これはプログラミングの質問ではないようです)。
次のシステムでプログラムをコンパイルしたいと思います。
Linux Ubuntu 3.0.0-12-一般 #20-Ubuntu x86 GNU/Linux
これはUbuntuの最新のWubi(32ビット)バージョンです。
ldd --version
出力ldd (Ubuntu EGLIBC 2.13-20ubuntu5) 2.13
コンパイルされたプログラムを実行したいシステム(Webサーバー):
Linux 2.6.37-he-xeon-64gb+1 i686 GNU/Linux
ldd --version
出力ldd (GNU libc) 2.7
メモ:
私のLinuxプログラムをプリコンパイルされたプログラムに置き換えると、すべてがうまく機能するため、サーバー側のエラーを排除できます。
アップデート#1:
Ubuntu 5.10のVirtualBoxでプログラムを実行してみましたが(Ubuntu 11.10では正常に動作しました)、それはうまくいきませんでした。良いニュースです。サーバーの誤りは確かにありません。 Ubuntu 5.10はちょうどそう言いました: floating point exception
。これは役に立ちますか? Ubuntu 11.10には例外がありますが、なぜ例外はありませんか?
アップデート#2:
これで、GNAT 3.4を使用してUbuntu 5.1にコンパイルされました。しかし、すべてが絶望的です。それでも出力がないldd
と言ってstatically linked
(この方法でコンパイルしたので)、strace
同じエラーメッセージが表示されます。どういう意味ですか?不足しているファイルがありますか?これがうまくいかないのですか?
execve("./words", ["./words"], [/* 15 vars */]) = 0
brk(0) = 0x811e000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f8000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f7000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb76f7680, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
答え1
Webサーバーまたは他のプログラムでシェルエスケープモードで操作を実行すると、環境設定が適用されない可能性があります。たとえば、などの変数PATH
にはLD_LIBRARY_PATH
デフォルト設定があるか設定がまったくないため、シェルエスケープを実行するときは、少なくとも次のことを行う必要があります。
- フルパスでプログラムを呼び出します。 例:
/usr/local/bin/gnatmake
または/usr/local/bin/words
- 出力を取得し、
/usr/bin/env
シェルエスケープで正しい設定があることを確認します。端末シェルで同じ設定を確認してください。 - Webサーバーに対する制御権がある場合は、権限の問題を回避するためにUIDで実行してください。
- プログラムに必要なライブラリの確認(存在する場合)
ldd /usr/local/bin/words
追加可能性
プログラムを直接実行する代わりに、次のスクリプトを使用します。
#!/bin/sh
. /etc/profile
/usr/bin/env
pwd
./words 2>&1
そして出力を投稿します。これにより、プログラムが実行されたのか、クラッシュしたのかがわかります。
確認する必要があるもう1つは、ユーザーwww-data
または実行中のすべてのエントリが./words
必要なデータベース(./words
存在する場合)へのアクセス権を持っているかどうかです。
答え2
プログラム自体を実行する代わりに、プログラムを実行し、その環境とSTDERR出力を記録するスクリプトを実行してみてください。
Webサーバーのログも確認する必要があります。
答え3
ええと…私はプログラミング初心者ですが…Webサーバーでプログラムをコンパイルすることはできますか?または、ネットワークサーバーで実行されているのと同じ構成で仮想マシンを作成して、そこでコードをコンパイルすることもできます。
1つはx86で、もう1つはi686だからですか?