首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MSVC工具生成裸金属二进制文件的过程是什么?

使用MSVC工具生成裸金属二进制文件的过程是什么?
EN

Stack Overflow用户
提问于 2020-11-21 14:46:29
回答 1查看 642关注 0票数 2

用MSVC工具生成裸金属二进制文件的过程是什么?

在GNU中,cc编译或as将源代码组装成对象文件,ld将对象文件链接到ELF中(使用链接器脚本),然后将相关部分作为“固件二进制”从ELF中提取出来。我想做同样的事情,但只使用MSVC提供的工具。

我一直在用下面的ARM64 startup.s进行测试

代码语言:javascript
复制
 AREA .text, CODE, READONLY
start
 LDR w1, =0xDEADBEEF
 B .
 END

这应该是简单地用0xDEADBEEF加载X1寄存器的下32位,然后自旋。要组装我运行的代码:

代码语言:javascript
复制
armasm64.exe startup.s

我猜想,如果我有一个peripherals.c源文件,我需要将startup.speripherals.c链接到一个可执行文件(COFF?,PE?)。最后,我需要去掉任何COFF/PE报头,这样ARM MCU就可以在加载时执行代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-24 05:35:48

免责声明:我不在我的专业领域,我根据我使用MSVC工具所做的一些测试,在阅读了一些Microsoft文档之后,并在问题被问到三天后,提出了一个答案,还没有给出任何答案。我希望这个答案能引起更多有根据的答案,这样我就可以高兴地收回它。

这个问题的答案是:“用MSVC工具生成裸金属二进制文件的过程是什么?”很有可能:“没有”。

aarch64-pe.asm

代码语言:javascript
复制
 AREA .text, CODE, READONLY
 EXPORT start
start
 LDR w1, =0xDEADBEEF
 B .
 END

(为了由链接器解析,需要使用EXPORT指令公开符号'start‘)。

装配:

代码语言:javascript
复制
armasm64.exe aarch64-pe.asm

例如,aarch64的链接器(14.28.29334.0版本)只支持有限的目标子系统列表:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

代码语言:javascript
复制
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-recordintel hex )。

因此,我的结论是,MSVC工具单独不允许构建aarch64裸金属应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64944350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档