我下載了命令列程式“Whitaker's Words”,它適用於 Linux 和 Windows 等。
有一個名為 的主程式words
。我嘗試在我的 Ubuntu (11.10) 機器上透過命令列執行它,它起作用了:
./words
當我在我的 Linux Web 伺服器(Linux 2.6.37-he-xeon-64gb+1 i686)上測試它時,它也能正常工作。
然後我決定對原始程式碼進行一些更改並重新編譯它。為此,我使用了以下命令(後四個是支援程式):
gnatmake -O3 words -bargs -static
gnatmake makedict -bargs -static
gnatmake makestem -bargs -static
gnatmake makeefil -bargs -static
gnatmake makeinfl -bargs -static
產生的程式再次在我的 Ubuntu 機器上正常運行,因為我可以在終端機中看到正確的輸出。
但是當我嘗試使用 PHPshell_exec()
或在我的網頁伺服器上執行它時passthru()
,根本沒有輸出!根據ldd
,該程序statically linked
應該確實有效,不是嗎?
我已經測試和調試了幾個星期,但我找不到任何原因。你能幫助我嗎?
您可以在這裡獲取該程式:下載連結位於 filedropper.com
(我想這不是程式設計問題,因為我的問題只是:如何讓程式在我的網頁伺服器上運行?)
我想在以下系統上編譯程式:
Linux ubuntu 3.0.0-12-generic #20-Ubuntu x86 GNU/Linux
這是 Ubuntu 的最新 Wubi(32 位元)版本。
ldd --version
輸出ldd (Ubuntu EGLIBC 2.13-20ubuntu5) 2.13
我想在(網頁伺服器)上運行編譯後的程式的系統:
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
當您從網頁伺服器或任何其他程式以 shell 轉義方式執行任何操作時,環境設定很可能不會被套用。例如,諸如:PATH
、LD_LIBRARY_PATH
等變數有其預設設定或沒有任何設置,因此當您進行 shell 轉義時,您至少應該執行以下操作:
- 透過完整路徑呼叫程式:例如
/usr/local/bin/gnatmake
或/usr/local/bin/words
- 取得輸出
/usr/bin/env
以確保在 shell 轉義中它具有正確的設定。檢查終端 shell 中的相同設定。 - 如果您可以控製網路伺服器,請嘗試使其作為您的 UID 執行以避免權限問題。
- 檢查程式需要哪些函式庫(如果有)
ldd /usr/local/bin/words
額外的可能性
使用以下腳本代替直接執行程式:
#!/bin/sh
. /etc/profile
/usr/bin/env
pwd
./words 2>&1
並發布輸出。這將告訴您程式是否執行以及是否崩潰。
另一件需要檢查的事情是使用者www-data
或正在運行的任何內容./words
是否能夠存取所需的資料庫(./words
如果有)。
答案2
嘗試不執行程式本身,而是執行執行程式的腳本並記錄其環境和 STDERR 輸出。
您還應該查看一下 WEB 伺服器日誌。
答案3
呃...我是程式設計的超級初學者,但是...也許在網頁伺服器中編譯程式?或建立一個與您在網頁伺服器上執行的配置相同的虛擬機,以便在那裡編譯程式碼。
因為一個是x86,一個是i686,對嗎?