Я загрузил программу командной строки «Whitaker's Words», которая была доступна как для Linux, так и для Windows и т. д.
Есть основная программа с именем words
. Я попробовал запустить ее на моей машине Ubuntu (11.10) в командной строке, и это сработало:
./words
Когда я протестировал это на своем веб-сервере Linux (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, и я увидел корректный вывод в терминале.
Но когда я попытался выполнить его на моем веб-сервере с помощью PHP shell_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 11.10) в моем VirtualBox под Ubuntu 5.10 — и она тоже не сработала. Хорошие новости, так что это точно не вина сервера. Ubuntu 5.10 только что сказал: floating point exception
. Это помогает? Почему есть исключение, но не под Ubuntu 11.10?
Обновление №2:
Сейчас скомпилировал с Ubuntu 5.1 с использованием GNAT 3.4. Но все надежды напрасны - по-прежнему нет вывода, 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
Когда вы выполняете что-либо как выход из оболочки с веб-сервера или любой другой программы, настройки среды, скорее всего, не будут применены. Например, переменные, такие как: PATH
, LD_LIBRARY_PATH
, и т. д. имеют свои настройки по умолчанию или вообще не имеют настроек, поэтому, когда вы выполняете выход из оболочки, вы должны как минимум сделать следующее:
- Вызовите программу по полному пути: например
/usr/local/bin/gnatmake
или/usr/local/bin/words
- получить вывод,
/usr/bin/env
чтобы убедиться, что в оболочке escape у него правильные настройки. Проверьте те же настройки в вашей терминальной оболочке. - Если у вас есть контроль над веб-сервером, попробуйте заставить его выполняться от вашего UID, чтобы избежать проблем с разрешениями.
- Проверьте, какие библиотеки требуются для программы, если таковые имеются.
ldd /usr/local/bin/words
ДОПОЛНИТЕЛЬНАЯ ВОЗМОЖНОСТЬ
Вместо непосредственного выполнения программы используйте следующий скрипт:
#!/bin/sh
. /etc/profile
/usr/bin/env
pwd
./words 2>&1
и опубликуйте вывод. Это скажет вам, выполняется ли программа или она вылетает.
Еще одна вещь, которую следует проверить, — имеет ли пользователь www-data
или то, что запускает, ./words
возможность доступа к необходимой базе данных ( ./words
если таковая имеется).
решение2
Попробуйте запустить не саму программу, а скрипт, запускающий эту программу и регистрирующий ее окружение и вывод STDERR.
Вам также следовало бы заглянуть в журналы вашего веб-сервера.
решение3
эээ... Я супер-новичок в программировании, но... может быть, скомпилировать программу на веб-сервере? Или создать виртуальную машину с той же конфигурацией, что вы запускаете на веб-сервере, чтобы скомпилировать код там.
Потому что один — x86, а другой — i686, верно?