Ubuntu编译的程序在Unix web服务器上运行

问题描述:

我已经在Ubuntu上使用GNAT编译了一个Ada程序。Ubuntu编译的程序在Unix web服务器上运行

之后,我试了一下这个程序的一些测试运行,它工作正常。

但是,当我上传到我的Apache(UNIX)网络服务器,并试图运行该程序,没有输出。这是为什么?

是不是可以在Ubuntu上编译的程序在UNIX服务器上无法运行?

(对不起,愚蠢的问题!)

Linux版本的我使用的编译信息(uname -a)系统:

Linux ubuntu 3.0.0-12-generiC#20-Ubuntu x86-64 GNU/Linux 

Linux版本的我想要运行的系统该方案对后来信息(uname -a):

Linux 2.6.37-he-xeon-64gb+1 i686 GNU/Linux 

对于编译Ubuntu的机器上,我使用:

gnatmake -O3 myprogram -bargs -static 
+3

你的web服务器是什么特定的操作系统? (对于初学者来说,'uname -a'的输出是什么) – blueshift 2012-03-18 15:11:34

+2

切换操作系统将需要重新编译,但我不熟悉Ada/GNAT – dldnh 2012-03-18 15:13:41

+0

谢谢blueshift和dldnh!服务器是:“Linux 2.6.37-he-xeon-64gb + 1 i686 GNU/Linux” – caw 2012-03-18 15:22:25

当你构建一个GNAT程序(gnatmake my_program),默认情况下它链接对动态链接库(libgnat.solibgnarl.so)。这些库是GNAT系统的一部分,不太可能在您的Web服务器上可用。

如果你说ldd my_program它会告诉你使用的共享库。

您可以强制编译说

gnatmake my_program -bargs -static 

使用静态GNAT库(该-bargs -static一定要来正规标志之后像-O2)。

编辑:more info on -bargs and friends

+0

非常感谢!当我使用'gnatmake -O3 -bargs -static myprogram'时,它会(可能)在我的网络服务器上工作? – caw 2012-03-18 18:23:45

+0

'ldd my_program'(原文上)显示共享库吗?如果确实如此,那么是的,你有更好的机会。正如我所展示的那样,“-bargs -static”需要最后一个。您的方式,'myprogram'只会发送给活页夹,而不会发送给构建者。 – 2012-03-18 21:11:24

+0

当我在我的web服务器上运行'ldd myprogram'时,它说'不是动态可执行文件',而对于预编译(工作)程序,我得到'linux-gate.so.1 =>(0xffffe000)libgcc_s.so.1 => /lib/libgcc_s.so.1(0xb777e000)libc.so.6 => /lib/libc.so.6(0xb7640000)/lib/ld-linux.so.2(0xb7793000)' – caw 2012-03-18 22:44:25

您必须确保服务器具有您的应用链接的库或静态链接它们,就像其他人已经建议的那样。其他一些意见指出,您需要“交叉编译”或服务器不会运行64位二进制文​​件。这很容易解决,除非你正在构建的应用程序非常复杂。

gnatmake --GCC = '的gcc -m32'

将将32位系统上运行的二进制。然而,主要问题是服务器(g)libc很可能比你的ubunu盒子上的要旧。针对较新的glibc编译的程序不一定会在安装了较旧的glibc的系统上运行。

更多的信息,还有更多的联系,看看这里:

Linking against an old version of libc to provide greater application coverage
How can I link to a specific glibc version?

编辑: 此外,Apache可能不被配置为接受外部二进制文件的调用。你有没有“试图运行该程序”与你知道存在于服务器上的东西?尝试运行一些像/ bin/ls这样的小事,以确保你的程序运行的方法正常。如果日志不起作用,请查看日志。程序需要可执行,顺便说一句:chmod 755/path/to/webeserver/uploads/ada-app

+0

非常感谢!交叉编译的问题已经解决了,因为我现在正在使用32位Ubuntu。仍然开放的问题是为什么'ldd'为我自己的编译返回'静态链接',而为预编译版本返回一个库列表。预编译版本是否不是静态的,以便它不包含库并具有依赖性? – caw 2012-03-27 12:32:07

+0

而且由于我静态链接了库,Apache不需要允许调用外部库,是吗? – caw 2012-03-27 12:34:21

+0

当我没有静态链接程序(作为预编译版本)时,'ldd'说'linux-gate.so.1 =>(0xffffe000)libgnat-4.4.so.1 =>找不到libgcc_s.so .1 => /lib/libgcc_s.so.1(0xb780e000)libc.so.6 => /lib/libc.so.6(0xb76cf000)/lib/ld-linux.so.2(0xb7823000)'。这是问题吗?它说“找不到”... – caw 2012-03-27 12:54:14

为什么不直接在Web服务器而不是本地机器上编译它?

Aswell cat /etc/issuecat /etc/release可能会给我们一些关于您使用的发行版的信息。

+0

在我的Ubuntu机器上,带有“release”的这个命令确实表示没有这样的目录。带有“issue”的命令表示它是'Ubuntu 11.10 \ n \ l'。在我的网络服务器上,这两个命令都没有输出。这是问题吗?这里没有输出...... – caw 2012-03-27 12:52:44

+0

@MarcoW。你确定你在网络服务器上运行Linux吗? – Earlz 2012-03-27 21:07:00

+0

当然可以。请参阅问题中的注释:'Linux 2.6.37-hee-xeon-64gb + 1 i686 GNU/Linux' – caw 2012-03-28 16:22:39