2012-03-18 102 views
1

我已經在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

回答

7

當你構建一個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

1

您必須確保服務器具有您的應用鏈接的庫或靜態鏈接它們,就像其他人已經建議的那樣。其他一些意見指出,您需要「交叉編譯」或服務器不會運行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

0

爲什麼不直接在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

相關問題