blaise/compiler/src/main/pascal/runtime.start.pas

53 lines
1.6 KiB
ObjectPascal

{
Blaise - An Object Pascal Compiler
Copyright (c) 2026 Graeme Geldenhuys
SPDX-License-Identifier: Apache-2.0 WITH Swift-exception
Licensed under the Apache License v2.0 with Runtime Library Exception.
See LICENSE file in the project root for full license terms.
}
unit runtime.start;
// Program entry point (x86_64, System V ABI, glibc-compatible).
//
// Inline-assembler port of runtime/src/main/asm/blaise_start_x86_64.s — _start
// is now an `asm … end` routine so the RTL needs no hand-written .s
// (docs/inline-asm-design.adoc, §"Migration of the .s files").
//
// This replaces the system Scrt1.o so the internal linker needs no
// gcc-provided startup object (issue #142). The linker uses '_start' as the
// ELF entry point; an unmangled unit-level routine named _start emits exactly
// that symbol.
//
// On entry the kernel hands us the initial process stack:
// (%rsp) argc 8(%rsp) argv[0] ... then NULL, envp, auxv
// and %rdx holds rtld_fini for PIE images. We marshal these into the args
// __libc_start_main(main, argc, argv, init=NULL, fini=NULL, rtld_fini,
// stack_end) expects; glibc runs the init array, calls main(argc, argv, envp),
// then exit(main's return). nostackframe: the body owns the whole frame.
interface
procedure _start;
implementation
procedure _start; assembler; nostackframe;
asm
endbr64
xor %ebp, %ebp
mov %rdx, %r9
pop %rsi
mov %rsp, %rdx
and $0xfffffffffffffff0, %rsp
push %rax
push %rsp
xor %r8d, %r8d
xor %ecx, %ecx
lea main(%rip), %rdi
call __libc_start_main@PLT
hlt
end;
end.