2015-04-27 6 views
1

Я разрабатываю простой исполняемый файл, который должен запускаться во время загрузки системы Android. Он использует небольшую библиотеку tinydir.h для просмотра файлов в определенном каталоге. И даже если он компилируется нормально для x86 и x86_64 (с помощью GCC на OS X), когда я пытаюсь построить его с самой Android системы (для ARM), я получаю следующий результат:Источник C не компилируется для архитектуры ARM

target StaticExecutable: preparefs (out/target/product/hammerhead/obj/EXECUTABLES/preparefs_intermediates/LINKED/preparefs) 
out/target/product/hammerhead/obj/lib/crtbegin_static.o:crtbrand.c:function _start: error: undefined reference to '__libc_init' 
out/target/product/hammerhead/obj/lib/crtbegin_static.o:crtbrand.c:function atexit: error: undefined reference to '__cxa_atexit' 
bionic/libc/include/string.h:178: error: undefined reference to 'memset' 
system/core/preparefs/tinydir.h:262: error: undefined reference to 'free' 
system/core/preparefs/tinydir.h:274: error: undefined reference to 'closedir' 
system/core/preparefs/tinydir.h:286: error: undefined reference to '__errno' 
system/core/preparefs/tinydir.h:291: error: undefined reference to '__errno' 
system/core/preparefs/tinydir.h:298: error: undefined reference to 'readdir' 
system/core/preparefs/main.c:23: error: undefined reference to 'malloc' 
system/core/preparefs/main.c:61: error: undefined reference to 'memcpy' 
system/core/preparefs/main.c:64: error: undefined reference to 'system' 
bionic/libc/include/string.h:121: error: undefined reference to 'strcpy' 
system/core/preparefs/tinydir.h:160: error: undefined reference to 'opendir' 
system/core/preparefs/tinydir.h:164: error: undefined reference to '__errno' 
system/core/preparefs/tinydir.h:171: error: undefined reference to 'readdir' 
system/core/preparefs/tinydir.h:331: error: undefined reference to '__errno' 
system/core/preparefs/main.c:75: error: undefined reference to 'strcmp' 
bionic/libc/include/string.h:238: error: undefined reference to '__strlen_chk' 
bionic/libc/include/string.h:229: error: undefined reference to 'strlen' 
bionic/libc/include/string.h:121: error: undefined reference to '__strcpy_chk' 
bionic/libc/include/string.h:168: error: undefined reference to '__strcat_chk' 
bionic/libc/include/string.h:121: error: undefined reference to '__strcpy_chk' 
bionic/libc/include/string.h:168: error: undefined reference to '__strcat_chk' 
system/core/preparefs/tinydir.h:371: error: undefined reference to 'stat' 
bionic/libc/include/string.h:276: error: undefined reference to '__strrchr_chk' 
bionic/libc/include/string.h:238: error: undefined reference to '__strlen_chk' 
system/core/preparefs/main.c:75: error: undefined reference to 'strcmp' 
system/core/preparefs/main.c:82: error: undefined reference to 'system' 
system/core/preparefs/main.c:85: error: undefined reference to 'system' 
bionic/libc/include/string.h:121: error: undefined reference to 'strcpy' 
bionic/libc/include/string.h:168: error: undefined reference to '__strcat_chk' 
bionic/libc/include/string.h:168: error: undefined reference to '__strcat_chk' 
system/core/preparefs/main.c:90: error: undefined reference to 'system' 
system/core/preparefs/main.c:92: error: undefined reference to 'fopen' 
system/core/preparefs/main.c:94: error: undefined reference to 'fseek' 
system/core/preparefs/main.c:95: error: undefined reference to 'ftell' 
system/core/preparefs/main.c:96: error: undefined reference to 'fclose' 
system/core/preparefs/main.c:98: error: undefined reference to 'fopen' 
system/core/preparefs/main.c:99: error: undefined reference to 'malloc' 
system/core/preparefs/main.c:100: error: undefined reference to 'fread' 
system/core/preparefs/main.c:101: error: undefined reference to 'fclose' 
bionic/libc/include/string.h:238: error: undefined reference to '__strlen_chk' 
system/core/preparefs/main.c:113: error: undefined reference to 'strcmp' 
system/core/preparefs/main.c:129: error: undefined reference to 'time' 
bionic/libc/include/stdio.h:387: error: undefined reference to 'snprintf' 
bionic/libc/include/string.h:121: error: undefined reference to 'strcpy' 
system/core/preparefs/main.c:140: error: undefined reference to '__stack_chk_fail' 
system/core/preparefs/main.c:140: error: undefined reference to '__stack_chk_guard' 
/tmp/AOSP-toolchain/build/../gcc/gcc-4.8/libgcc/unwind-arm-common.inc:289: error: undefined reference to 'abort' 
/tmp/AOSP-toolchain/build/../gcc/gcc-4.8/libgcc/unwind-arm-common.inc:346: error: undefined reference to 'memcpy' 
/tmp/AOSP-toolchain/build/../gcc/gcc 

-4.8/libgcc/unwind-arm-common.inc:376: error: undefined reference to 'memcpy' 
/tmp/AOSP-toolchain/build/../gcc/gcc-4.8/libgcc/unwind-arm-common.inc:505: error: undefined reference to 'abort' 
/tmp/AOSP-toolchain/build/../gcc/gcc-4.8/libgcc/config/arm/pr-support.c:378: error: undefined reference to 'abort' 
/tmp/AOSP-toolchain/build/../gcc/gcc-4.8/libgcc/config/arm/pr-support.c:384: error: undefined reference to 'abort' 
collect2: error: ld returned 1 exit status 
make: *** [out/target/product/hammerhead/obj/EXECUTABLES/preparefs_intermediates/LINKED/preparefs] Error 1 

#### make failed to build some targets (06:00 (mm:ss)) #### 

И вот файл Android.mk, который я использую:

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE:= preparefs 

LOCAL_SRC_FILES := main.c 

LOCAL_CFLAGS += -std=gnu99 -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group -fsigned-char -Wall -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Winline -Werror 

LOCAL_FORCE_STATIC_EXECUTABLE := true 
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)/sbin 
LOCAL_LDLIBS  += -llog -ldl 

include $(BUILD_EXECUTABLE) 

include $(call first-makefiles-under,$(LOCAL_PATH)) 

Любые идеи о том, что я могу сделать, чтобы оно было построено?

Заранее благодарен!

- Edit: Вот раздели версию файла main.c, который можно использовать для воспроизведения проблемы:

#include <stdint.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <tinydir.h> 
#include <time.h> // don't mind the unnecessary imports, I removed some code to provide this sample 

int main(void) { 
    tinydir_dir dir; 
    tinydir_open(&dir, "/directory"); 

    while (dir.has_next) 
    { 
     tinydir_file file; 
     tinydir_readfile(&dir, &file); 

     if(strcmp(file.name, ".") == 0 || strcmp(file.name, "..") == 0) 
     { 
      tinydir_next(&dir); 
      continue; 
     } 
     if (file.is_dir) 
     { 
      return 1; 
     } 

     //doing something about the file 

     tinydir_next(&dir); 
    } 

    tinydir_close(&dir); 

    return 0; 
} 
+0

Можете ли вы представить полный воспроизводимый пример? Почему вы явно поставляете '-lc'? – fuz

+0

'C исполняемый файл не будет компилироваться для архитектуры ARM'. Это вздор. Один не компилирует исполняемые файлы. Вы: «Источник C не будет компилироваться для архитектуры ARM»? – greenapps

+0

@FUZxxl Я отредактировал сообщение, чтобы включить образец кода. Это не весь файл, который я использую, но его должно быть достаточно. Много используемых флагов я добавил, пытаясь заставить код работать. Я понимаю, что большинство из них не нужны. –

ответ

0

Этих функций является частью LIBC, который находится в директории вашей руки ToolChain в , Вероятно, ваша инструментальная цепочка не настроена должным образом. Проверьте свой каталог инструментальной цепочки и убедитесь, что libc.so действительно есть, и сделайте nm -g libc.a (используйте кросс-компиляционную версию плеча nm, а не версию хоста). Если функций там нет, вам, возможно, придется переконфигурировать/перекомпилировать вашу инструментальную цепочку с соответствующими параметрами. Если они есть, вам нужно будет убедиться, что вы пытаетесь установить связь с этой библиотекой.

+0

Плакат пытаясь построить код как часть общей сборки источников системы Android - процесс, который включает в себя получение и использование правильно настроенной инструментальной цепочки для кросс-компиляции цели. Если бы были проблемы с установкой, это, вероятно, сработало бы при создании кода запаса, прежде чем перейти к их настройке. Кроме того, код должен строиться против локально скомпилированной версии Bionic libc, а не с помощью чего-то вроде NDK. –

Смежные вопросы