尽管很多人认为“本地编译”比“交叉编译”更有好处,或者至少没有区别,但事实恰恰相反。
对于在较低级别(即linux内核)上工作的人,他们通常会遭受编译平台周围的复制。以 x86 和 ARM 为例,直接的想法是构建 ARM 编译库,但这是个坏主意。
二进制有时是不一样的,例如,
# diff hello_x86.ko hello_arm.ko
Binary files hello_x86.ko and hello_arm.ko differ
# diff hello_x86_objdump.txt hello_arm_objdump.txt
2c8
< hello_x86.ko: file format elf64-littleaarch64
---
> hello_arm.ko: file format elf64-littleaarch64
26,27c26,27
< 8: 91000000 add x0, x0, #0x0
< c: 910003fd mov x29, sp
---
> 8: 910003fd mov x29, sp
> c: 91000000 add x0, x0, #0x0
一般来说,较高级别的应用程序可以同时使用,建议使用较低级别(硬件相关)的工作,x86 "cross compile"
因为它具有更好的工具链。
无论如何,编译是关于 GCC Glibc 和 lib.so 的工作,如果熟悉这些,任何一种方式都应该容易上手。
PS:下面是源码
# cat hello.c
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_ALERT */
#include <linux/init.h> /* Needed for the macros */
static int hello3_data __initdata = 3;
static int __init hello_3_init(void)
{
printk(KERN_ALERT "Hello, world %d\n", hello3_data);
return 0;
}
static void __exit hello_3_exit(void)
{
printk(KERN_ALERT "Goodbye, world 3\n");
}
module_init(hello_3_init);
module_exit(hello_3_exit);
MODULE_LICENSE("GPL");