Programa Linux que se ejecuta en una máquina Ubuntu pero no en un servidor web Unix

Programa Linux que se ejecuta en una máquina Ubuntu pero no en un servidor web Unix

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 linkedasí 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 --versionsalidasldd (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 --versionsalidasldd (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, ldddice statically linked(ya que lo compilé de esa manera) y stracemuestra 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/gnatmakeo/usr/local/bin/words
  • obtenga el resultado de /usr/bin/envpara 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 correspondeldd /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-datao lo que sea que esté ejecutando es ./wordscapaz de acceder a la base de datos que ./wordsnecesita, 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?

información relacionada