Excellent! I love how the changes are really minimal, and looking at them, most are pretty self-explanatory (e.g. you needed to add a linker script to produce a correctly laid out ELF file instead of a Mach-O file). I think we should be able to eliminate the need for these stubs:
void posix_memalign(void) {
while (1) {}
}
void __stack_chk_fail(void) {
while (1) {}
}
void __stack_chk_guard(void) {
while (1) {}
}
void free(void *ptr) {
while (1) {}
}
(1) If you disable stack protectors (-disable-stack-protector
swiftc flag), I'd expect __stack_chk_fail
and __stack_chk_guard
to not be needed anymore. See https://github.com/apple/swift/blob/main/docs/EmbeddedSwift/UserManual.md#external-dependencies. But of course, stack protectors are generally useful.
(2) I think that asking the compiler to place functions into separate sections (-Xfrontend -function-sections
, the equivalent of Clang's/GCC's -ffunction-sections
) should enable dead-code stripping, and then the posix_memalign
and free
dependencies will go away because you don't use any allocations in the example. I am actually trying to pursue enabling this behavior by default on ELF, see https://github.com/apple/swift/pull/70788.