2015-05-31 56 views
2

通過獨立的Android NDK r10e Toolchain(使用--toolchain = x86-clang3.6開關構建)獲得了這種奇怪的行爲。交叉編譯的環境變量已設置運行makefile之前,SYSROOT指向Android工具鏈位置,CXX等於i686-linux-android-clang ++。基本上,我有一堆我想編譯爲Android可執行文件的cpp文件。可悲的是,鏗鏘聲++繼續生產.so共享庫(使用readelf進行檢查 - 它確實是共享對象)。有沒有我已經忘記的編譯器/鏈接器的特殊開關?Readelf報告程序是一個共享庫,而不是可執行文件

生成文件:(main.cpp中包含的主要功能)

CFLAGS=-c -Wall -std=c++11 -Wextra --sysroot=${SYSROOT} -march=i686 
LDFLAGS=-lc -lc++_shared -L${SYSROOT}/usr/lib 
SOURCES=main.cpp File1.cpp File2.cpp File3.cpp File4.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=test 

all: $(SOURCES) $(EXECUTABLE) 
$(EXECUTABLE): $(OBJECTS) ${CXX} $(LDFLAGS) $(OBJECTS) -o [email protected] 
.cpp.o: ${CXX} $(CFLAGS) $< -o [email protected] 
clean: rm *.o test 
+1

你確定你已經在這裏複製你的makefile嗎?對我來說,看起來這個makefile很可能會讓你不知道如何構建錯誤。在先決條件/配方之前應該有一個換行符/ TAB,否則它們應該用';'分開。 – MadScientist

+0

@MadScientist這是正確的,TAB在這裏不見了,可能在粘貼時將它剪掉。 – cleaweag

+0

在StackOverflow上缺少TAB很常見。缺少換行符不是那麼多... :) – MadScientist

回答

1

鐺++不斷產生。所以共享庫(與readelf檢查 - 它的確是共享對象)。有沒有我已經忘記的編譯器/鏈接器的特殊開關?

猜測readelf正在輸出Elf file type is DYN (shared object file),而你解釋這意味着共享對象:)

你可能不喜歡的東西:

readelf -l test | grep -i "file type" 

在現實中,這是位置獨立可執行(PIE)和readelf報告的人工產物。

的重要組成部分,是readelf是報告DYN,並報告EXEEXE意味着它缺少PIE,並且通常會觸發安全相關的缺陷。


PIE是在Android 4.1中添加的,但它是可選的。 PIE是Android 5.0及以上版本所必需的。從Security Enhancements in Android 5.0

非PIE鏈接器支持刪除。 Android現在需要所有動態鏈接的可執行文件來支持PIE(與位置無關的 可執行文件)。這增強了Android的地址空間佈局 隨機化(ASLR)實現。


也看到堆棧溢出Position Independent Executables。它討論了PIE和Android。

+0

Thst正是我所做的。更重要的是,在複製編譯後的文件並從adb shell運行它之後,它只是按預期工作。謝謝你指點我正確的方向:) – cleaweag

相關問題