我正在编译一个来自源代码的nexus安卓内核,如HTCs developer website所示。我通过DLing来自android开发站点的android NDK获得了一个ARM工具链。我可以运行make clean并在没有发生事故的情况下进行defconfig,但是当我运行make时,它只会在遇到编译错误之前得到这样的好处。
目前我看到以下内容:
$ MY_DIR / nexus_one / arch / arm / include / asm / glue.h:156:29:错误:'#'后面没有宏参数
违规行是:
1 /*
2 * Instruction Fault Status Register. (New register as of ARMv6)
3 * If processor has IFSR then set value, else set translation fault
4 */
5 #if defined(CONFIG_CPU_ABRT_EV7) || defined(CONFIG_CPU_ABRT_EV6)
6 # define CPU_PABORT_IFSR(reg) mrc p15, 0, reg, cr5, cr0, 1 @asm macro;
7 #else
8 # define CPU_PABORT_IFSR(reg) mov reg, #5 @asm macro;
9 #endif
具体来说,上面第8行是编译器的主要内容。显然你不能拥有第二个#符号,但我不确定这个代码中是什么,它看起来非常重要,所以我不想触摸它。
我猜我正在使用错误的工具链进行编译?或许我以某种方式错误地配置了错误?有没有人知道这是什么意思?
感谢, 布赖恩
答案 0 :(得分:1)
我强烈建议您使用CodeSourcery工具链来编译Linux内核。
答案 1 :(得分:1)
原来这与特定的工具链无关。 #符号需要某种“转义”。解决方案如下:
/* this is needed to get the mov reg, 5 macro to compile and function correctly */
#define hash_hackery #
#define f(x) x
#if defined(CONFIG_CPU_ABRT_EV7) || defined(CONFIG_CPU_ABRT_EV6)
# define CPU_PABORT_IFSR(reg) mrc p15, 0, reg, cr5, cr0, 1 @asm macro;
#else
# define CPU_PABORT_IFSR(reg) mov reg, f(hash_hackery)5 @asm macro;
#endif
This post在找到答案时非常有用。