root@hlte:/data/local # ./tcpdump -p -s 0
error: only position independent executables (PIE) are supported.
由于使用了NDK編譯的可執行文件在應用中調用,在4.4及之前的版本上一直沒出問題。最近由于要測試在Android L上的運行情況發現,當運行該可執行文件時,報上面的錯誤。
PIE這個安全機制從4.1引入,但是Android L之前的系統版本并不會去檢驗可執行文件是否基于PIE編譯出的。因此不會報錯。但是Android L已經開啟驗證,如果調用的可執行文件不是基于PIE方式編譯的,則無法運行。解決辦法是在Android.mk中加入如下flag就行。
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE