用MSVC工具生成裸金属二进制文件的过程是什么?
在GNU中,cc编译或as将源代码组装成对象文件,ld将对象文件链接到ELF中(使用链接器脚本),然后将相关部分作为“固件二进制”从ELF中提取出来。我想做同样的事情,但只使用MSVC提供的工具。
我一直在用下面的ARM64 startup.s进行测试
AREA .text, CODE, READONLY
start
LDR w1, =0xDEADBEEF
B .
END这应该是简单地用0xDEADBEEF加载X1寄存器的下32位,然后自旋。要组装我运行的代码:
armasm64.exe startup.s我猜想,如果我有一个peripherals.c源文件,我需要将startup.s和peripherals.c链接到一个可执行文件(COFF?,PE?)。最后,我需要去掉任何COFF/PE报头,这样ARM MCU就可以在加载时执行代码。
发布于 2020-11-24 05:35:48
免责声明:我不在我的专业领域,我根据我使用MSVC工具所做的一些测试,在阅读了一些Microsoft文档之后,并在问题被问到三天后,提出了一个答案,还没有给出任何答案。我希望这个答案能引起更多有根据的答案,这样我就可以高兴地收回它。
这个问题的答案是:“用MSVC工具生成裸金属二进制文件的过程是什么?”很有可能:“没有”。
aarch64-pe.asm
AREA .text, CODE, READONLY
EXPORT start
start
LDR w1, =0xDEADBEEF
B .
END(为了由链接器解析,需要使用EXPORT指令公开符号'start‘)。
装配:
armasm64.exe aarch64-pe.asm例如,aarch64的链接器(14.28.29334.0版本)只支持有限的目标子系统列表:
BOOT_APPLICATION,
CONSOLE,
WINDOWS,
NATIVE,
POSIX,
EFI_APPLICATION, EFI_BOOT_SERVICE_DRIVER, EFI_ROM, EFI_RUNTIME_DRIVER从微软和EFI文档来看,所有这些子系统似乎都需要一个能够理解PECOFF格式的加载程序,或者在BCD WMI Provider子系统的情况下能够运行到BOOT_APPLICATION环境中。
没有所谓的"BAREMETAL“子系统。当试图将aarch64-pe.obj链接到每个子系统但使用EFI_ROM作为基本地址时,链接器退出显示相同的错误,抱怨起始地址不能小于4 4GiB:
D:\opt\msvc\arm64>for %I in (BOOT_APPLICATION CONSOLE WINDOWS NATIVE POSIX EFI_APPLICATION EFI_BOOT_SERVICE_DRIVER EFI_ROM EFI_RUNTIME_DRIVER) do link /entry:start /BASE:0x0000000040000000 /subsystem:%I aarch64-pe.obj
D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:BOOT_APPLICATION aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB
D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:CONSOLE aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB
D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:WINDOWS aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB
D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:NATIVE aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB
D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:POSIX aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB
D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:EFI_APPLICATION aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB
D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:EFI_BOOT_SERVICE_DRIVER aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB
D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:EFI_ROM aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : warning LNK4075: ignoring '/BASE' due to '/SUBSYSTEM:EFI_ROM' specification
D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:EFI_RUNTIME_DRIVER aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB这可能是一个裸金属嵌入式系统的问题,或者这可能需要一个MMU是可用的,并已由一个.裸金属程序开始的MMU从一个启动地址不超过4GiB。
当对aarch64pe.efi运行dumpbin.exe时,基址似乎被设置为0000000180000000,因为ldr指令位于0x0000000180001000,并且文件类型设置为DLL。
dumpbin.exe /disasm aarch64-pe.efi
File Type: DLL
0000000180001000: 18000041 ldr w1,0000000180001008
0000000180001004: 14000000 b 0000000180001004
0000000180001008: DEADBEEF
Summary
1000 .rdata
1000 .text当对以dumpbin.exe为基地址的链接器生成的可执行文件执行0x0000000100000000时,文件类型是一致的EXECUTABLE IMAGE。
更重要的是,dumpbin.exe似乎也不提供将生成的可执行文件转换为标准格式(如s-record或intel hex )。
因此,我的结论是,MSVC工具单独不允许构建aarch64裸金属应用程序。
https://stackoverflow.com/questions/64944350
复制相似问题