Заявление об ограничении ответственности: я здесь не в своей области знаний, и я предлагаю ответ, основанный на некоторых тестах, которые я провел с помощью инструментов MSVC, после прочтения некоторой документации Microsoft и через три дня после того, как вопрос был задан. и пока не было предложено никаких ответов. Я надеюсь, что этот ответ повлечет за собой более осознанные ответы, так что я с радостью отозвусь от него.
Ответ на вопрос Каков процесс создания двоичного файла с нуля с помощью инструментов MSVC? вероятно: нет.
aarch64-pe.asm
:
AREA .text, CODE, READONLY
EXPORT start
start
LDR w1, =0xDEADBEEF
B .
END
(Символ «начало» должен быть обнародован с помощью директивы EXPORT
, чтобы компоновщик разрешил его).
Сборка:
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
Из документации Microsoft и EFI кажется, что для всех этих подсистем требуется загрузчик, способный понимать формат PECOFF
или иметь возможность работать в среде BCD WMI Provider
в случае подсистемы BOOT_APPLICATION
.
Подсистемы BAREMETAL не существует. При попытке связать aarch64-pe.obj для каждой из подсистем, но EFI_ROM
с использованием 0x0000000040000000
в качестве базового адреса, компоновщик завершил работу с той же ошибкой, жалуясь, что начальный адрес не может быть меньше 4 ГБ:
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 с начального адреса менее 4 ГБ.
При запуске dumpbin.exe
против aarch64-pe.efi базовый адрес, казалось, был установлен на 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 на «голое железо» в настоящее время.
person
Frant
schedule
24.11.2020
binutils-2.35.1/bfd/config.bfd
, похоже, в настоящее время нет никакой поддержки для формата PE и aarch64. - person Frant   schedule 23.11.2020or does their object file fit within something that gnu ld accepts?
или на ваш комментарий: ответ - нет, насколько я понимаю. Но да, я полагаю, можно было бы написать инструмент преобразования. - person Frant   schedule 23.11.2020