我下载了命令行程序“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,对吗?