我的目标是Cortex-A7(ARMv7-A)
作为测试:
bootstrap.s
.globl _start
_start:
mov sp,#0x00010000
bl main
hang: b hang
的main.c
int main(void) { return 0; }
尝试:
$ as -arch armv7 -march=armv7-a -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 bootstrap.s -o bootstrap.o
$ file bootstrap.o
bootstrap.o: Mach-O object arm
$ clang -c -arch armv7 -march=armv7-a -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 main.c -o main.o
$ file main.o
notmain.o: Mach-O object arm
确认Mach-O手臂对象文件的编译(也使用hexdump
,otool
,gobjdump
验证
但现在我们尝试将它们连接在一起:
$ ld -e _start -arch armv7 bootstrap.o main.o -o foo
ld: warning: -ios_version_min not specified, assuming 6.0
ld: building for iOS, but linking in object file built for OSX, file 'bootstrap.o' for architecture armv7
我们有一些问题。不确定这里发生了什么。我还没有要求链接任何iOS相关内容。使用-t
链接器标志确认没有其他对象被链接。不确定为什么它认为bootstrap.o
是为OS X构建的,当它显然是Mach-O arm文件时。不确定我是否将正确的标志传递给汇编程序(几乎所有这些都没有记录?)或链接器
请注意,这是针对在RPi2上运行的裸机迷你项目。无论如何,我将链接的可执行对象gobjcopy
转换为平面二进制文件。我只是使用Mach-O,因为它是OS X上的系统链接器能够使用的唯一对象类型(和胖Mach-O)。如果我构建了一个单独的交叉编译器,我会做同样的事情,而不是在将它们转换为平面二进制文件之前链接ELF文件(无论如何我都可以使用clang / llvm输出ELF32文件,我只是无法链接他们)。当clang / llvm是一个非常合适的交叉编译器,能够定位我的微体系结构时,似乎很难建立一个单独的交叉编译器