虽然很多人认为“本地编译”更有益或者至少与“交叉编译”没有区别,但事实恰恰相反。
对于从事较低级别工作的人,比如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“交叉编译”
,因为它具有更好的工具链。
总之,编译是关于 GCC Glibc 和 lib.so 的工作,如果熟悉这些,任何一种方式都应该很容易。
PS:以下是源代码
# cat hello.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
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");
gcc -march=armv6
。 - SnakeDocqemu
进行测试。但是这时候过程的缓慢就会成为一个问题。 - artless noise