Using a .NET 8 RC 1 SDK compiled on s390x with #90292 applied locally, dotnet tool install -g dotnet-ef fails:
$ dotnet tool install -g dotnet-ef
Unhandled exception: Microsoft.NET.HostModel.AppHost.AppHostNotPEFileException: Selected apphost is not a valid PE file. Subsystem offset out of file range.
at Microsoft.NET.HostModel.AppHost.PEUtils.GetWindowsGraphicalUserInterfaceBit(MemoryMappedViewAccessor accessor)
at Microsoft.NET.HostModel.AppHost.PEUtils.GetWindowsGraphicalUserInterfaceBit(String filePath)
at Microsoft.DotNet.ShellShim.AppHostShellShimMaker.CreateApphostShellShim(FilePath entryPoint, FilePath shimPath)
at Microsoft.DotNet.ShellShim.ShellShimRepository.<>c__DisplayClass5_0.<CreateShim>b__0()
at Microsoft.DotNet.Cli.TransactionalAction.<>c__DisplayClass5_0.<Run>b__0()
at Microsoft.DotNet.Cli.TransactionalAction.Run[Object](Func`1 action, Action commit, Action rollback)
at Microsoft.DotNet.Cli.TransactionalAction.Run(Action action, Action commit, Action rollback)
at Microsoft.DotNet.ShellShim.ShellShimRepository.CreateShim(FilePath targetExecutablePath, ToolCommandName commandName, IReadOnlyList`1 packagedShims)
at Microsoft.DotNet.Tools.Tool.Install.ToolInstallGlobalOrToolPathCommand.Execute()
at Microsoft.DotNet.Tools.Tool.Install.ToolInstallCommand.Execute()
at Microsoft.DotNet.Cli.ToolInstallCommandParser.<>c.<ConstructCommand>b__17_0(ParseResult parseResult)
at System.CommandLine.Invocation.AnonymousCliAction.Invoke(ParseResult parseResult)
at System.CommandLine.Invocation.InvocationPipeline.Invoke(ParseResult parseResult)
at System.CommandLine.ParseResult.Invoke()
at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, TimeSpan startupTime, ITelemetry telemetryClient)
The stack trace suggests this is the culprit:
| internalstaticunsafeushortGetWindowsGraphicalUserInterfaceBit(MemoryMappedViewAccessoraccessor) |
| { |
| byte*pointer=null; |
| |
| try |
| { |
| accessor.SafeMemoryMappedViewHandle.AcquirePointer(refpointer); |
| byte*bytes=pointer+accessor.PointerOffset; |
| |
| // https://en.wikipedia.org/wiki/Portable_Executable |
| uintpeHeaderOffset=((uint*)(bytes+PEOffsets.DosStub.PESignatureOffset))[0]; |
| |
| if(accessor.Capacity<peHeaderOffset+PEOffsets.PEHeader.Subsystem+sizeof(ushort)) |
| { |
| thrownewAppHostNotPEFileException("Subsystem offset out of file range."); |
| } |
| |
| ushort*subsystem=((ushort*)(bytes+peHeaderOffset+PEOffsets.PEHeader.Subsystem)); |
| |
| returnsubsystem[0]; |
| } |
| finally |
| { |
| if(pointer!=null) |
| { |
| accessor.SafeMemoryMappedViewHandle.ReleasePointer(); |
| } |
| } |
| } |
Probably an endianness issue?
Using a .NET 8 RC 1 SDK compiled on s390x with #90292 applied locally,
dotnet tool install -g dotnet-effails:The stack trace suggests this is the culprit:
runtime/src/installer/managed/Microsoft.NET.HostModel/AppHost/PEUtils.cs
Lines 114 to 142 in 32c3355
Probably an endianness issue?