Descargué el programa de línea de comandos "Whitaker's Words", que estaba disponible tanto para Linux como para Windows, etc.
Hay un programa principal llamado words
. Intenté ejecutarlo en mi máquina Ubuntu (11.10) en la línea de comando y funcionó:
./words
Cuando lo probé en mi servidor web Linux (Linux 2.6.37-he-xeon-64gb+1 i686), también funcionó.
Luego decidí aplicar algunos cambios al código fuente y recompilarlo. Para eso, utilicé los siguientes comandos (los últimos cuatro son programas de soporte):
gnatmake -O3 words -bargs -static
gnatmake makedict -bargs -static
gnatmake makestem -bargs -static
gnatmake makeefil -bargs -static
gnatmake makeinfl -bargs -static
El programa resultante volvió a funcionar correctamente en mi máquina Ubuntu, ya que pude ver la salida correcta en la terminal.
Pero cuando intenté ejecutarlo en mi servidor web usando PHP shell_exec()
o passthru()
, ¡simplemente no hubo resultado! Según ldd
, el programa es statically linked
así y realmente debería funcionar, ¿no?
He estado probando y depurando durante semanas y no encuentro ninguna razón por la que esto sea así. ¿Me puedes ayudar?
Puedes conseguir el programa aquí:enlace de descarga en filedropper.com
(Supongo que esto no es una cuestión de programación, ya que mi problema es simplemente: ¿Cómo hacer que ese programa se ejecute en mi servidor web?)
Sistema en el que quiero compilar el programa:
Linux ubuntu 3.0.0-12-genérico #20-Ubuntu x86 GNU/Linux
Esta es la versión más reciente de Wubi (32 bits) de Ubuntu.
ldd --version
salidasldd (Ubuntu EGLIBC 2.13-20ubuntu5) 2.13
Sistema en el que quiero ejecutar el programa compilado (servidor web):
Linux 2.6.37-he-xeon-64gb+1 i686 GNU/Linux
ldd --version
salidasldd (GNU libc) 2.7
Nota:
Los errores en el lado del servidor se pueden excluir ya que todo funciona bien si simplemente reemplazo mi propio programa Linux por uno precompilado.
Actualización n.º 1:
Intenté ejecutar el programa (que funciona bien en Ubuntu 11.10) en mi VirtualBox en Ubuntu 5.10, y tampoco funcionó. Buenas noticias, definitivamente no es culpa del servidor. Ubuntu 5.10 acaba de decir: floating point exception
. ¿Esto ayuda? ¿Por qué hay una excepción pero no en Ubuntu 11.10?
Actualización #2:
Ahora compilado con Ubuntu 5.1 usando GNAT 3.4. Pero todos no esperan nada: todavía no hay resultados, ldd
dice statically linked
(ya que lo compilé de esa manera) y strace
muestra el mismo mensaje de error. ¿Qué significa? ¿Falta algún archivo? ¿Es esta la razón por la que no funciona?
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 +++
Respuesta1
Cuando ejecuta algo como un escape de shell desde el servidor web o cualquier otro programa, es muy probable que la configuración del entorno no se aplique. Por ejemplo, variables como: PATH
, LD_LIBRARY_PATH
, etc. tienen su configuración predeterminada o ninguna configuración, por lo que cuando realiza el escape del shell debe al menos hacer lo siguiente:
- Llame al programa por la ruta completa: por ejemplo
/usr/local/bin/gnatmake
o/usr/local/bin/words
- obtenga el resultado de
/usr/bin/env
para asegurarse de que en el escape del shell tenga la configuración adecuada. Verifique la misma configuración en el shell de su terminal. - Si tiene control del servidor web, intente ejecutarlo como su UID para evitar problemas de permisos.
- Compruebe qué bibliotecas son necesarias para el programa, si corresponde
ldd /usr/local/bin/words
POSIBILIDAD ADICIONAL
En lugar de ejecutar el programa directamente, utilice el siguiente script:
#!/bin/sh
. /etc/profile
/usr/bin/env
pwd
./words 2>&1
y publicar la salida. Esto le indicará si el programa se ejecuta y si falla.
Una cosa más para verificar es si el usuario www-data
o lo que sea que esté ejecutando es ./words
capaz de acceder a la base de datos que ./words
necesita, si corresponde.
Respuesta2
Intente ejecutar no el programa en sí, sino un script que ejecute este programa y registre su entorno y la salida STDERR.
También debería haber echado un vistazo a los registros de su servidor WEB.
Respuesta3
uh... soy súper principiante en programación, pero... ¿quizás compilar el programa en el servidor web? O cree una máquina virtual con la misma configuración que ejecuta en el servidor web, para compilar el código allí.
Porque uno es x86 y el otro es i686, ¿verdad?