2012-09-09 47 views
0

根據與NDK獨立的工具鏈和仿生一定的侷限性,我已經推出採用的crosstool-NG這些常規設置我自己的工具鏈撥打:問題與系統(當交叉編譯的Android

  • 的binutils-2.22
  • GCC-4.5.3與gfortran啓用
  • 的glibc-2.14.1
  • 內核頭文件-2.35.7
  • 拱ARM4T

使用這個我建立一個可執行文件,並將所有依賴包括libc,ld-linux等與它一起上傳到我的Android設備上。我手動運行可執行文件與ld-linux.so.3 - 庫路徑...

這是一個非常複雜的可執行文件,它似乎工作,除非,如果我做任何系統()調用,甚至一些基本的東西,如系統(「pwd」)或系統(NULL),我得到127作爲狀態(未找到)。如果我走得更遠,使用POPEN而是收集的響應,我得到:

* glibc的檢測*雙重釋放或腐敗

這是怎麼回事?有沒有人成功做過類似的事情?是否有權限問題? Android有什麼根本性的不同,使system()調用不可能?我在哪裏可以找到仿生如何處理系統和popen(源代碼),因爲我認爲如果您使用NDK,則可以執行system()調用。

+0

您什麼時候得到glibc錯誤?在「popen」電話上?或之後的一些電話? –

+1

'/ bin/sh'不在Android上;它在'/ system/bin/sh' AFAIK中。 glibc很可能只是使用'/ bin/sh'。 – nneonneo

+0

nneonneo - 你知道系統()調用在glibc中處理的位置嗎?具體來說,在源代碼中哪裏?除了修改源代碼之外,是否還有更好的方法來覆蓋它的外觀,比如環境變量? – corbin

回答

1

(1)SHELL環境變量不太可能在Android上設置。缺省shell /bin/sh不存在(AFAIK);它在/system/bin/sh。這可能是導致system失敗的原因。 (2)你可以在GitHub上找到實現:systempopen。您在glibc中的崩潰聽起來像是一個庫bug(除非您在信號處理程序或多線程環境中使用popen

+0

SHELL沒有設置,但設置它本身並沒有解決我的問題。需要返回到一個更簡單的測試用例,然後再回報。我認爲,根據你和戴維的建議,我可能會有一條前進的道路,但首先需要更好地理解這個問題。 – corbin

+0

嗯,原來'system'使用'#define SHELL_PATH「/ bin/sh」'。通過「SHELL」影響它...... – nneonneo

+1

修改glibc源代碼以正確定義shell路徑使系統調用起作用,但對popen進行相同更改並未解決問題。現在深入挖掘。 – corbin

1

我會建議只是滾動你自己的版本system。這並不複雜,這將使您能夠確定失敗的確切系統調用以及失敗的錯誤。最有可能的是,shell不正確,這就是產生錯誤的原因 - 你的庫指定了一個不存在的shell程序。