Date: Sat, 5 Aug 2023 00:48:28 +0200 From: Yuri <yuri@aetern.org> To: hackers@freebsd.org Subject: amd64-gcc12 seems to break linker sets Message-ID: <6a0f626c-95b4-2398-0a6d-9428c440131b@aetern.org>
next in thread | raw e-mail | index | archive | help
I noticed that kernel built using amd64-gcc12 panics on `kldload dtraceall`: panic: probe defined without a provider cpuid = 4 time = 1691186663 KDB: stack backtrace: db_trace_self_wrapper() at db_trace_self_wrapper+0x35/frame 0xfffffe00c448b8a0 vpanic() at vpanic+0x232/frame 0xfffffe00c448b950 panic() at panic+0x3c/frame 0xfffffe00c448b9b0 sdt_kld_load_probes() at sdt_kld_load_probes+0x346/frame 0xfffffe00c448bb70 sdt_load_probes_cb() at sdt_load_probes_cb+0x9/frame 0xfffffe00c448bb80 linker_file_foreach() at linker_file_foreach+0x53/frame 0xfffffe00c448bbc0 linker_load_dependencies() at linker_load_dependencies+0xe18/frame 0xfffffe00c448bc70 link_elf_load_file() at link_elf_load_file+0x10c6/frame 0xfffffe00c448bd50 sys_kldload() at sys_kldload+0x820/frame 0xfffffe00c448bdf0 amd64_syscall() at amd64_syscall+0x11b/frame 0xfffffe00c448bf30 fast_syscall_common() at fast_syscall_common+0xf8/frame 0xfffffe00c448bf30 --- syscall (304, FreeBSD ELF64, kldload), rip = 0x7e7e919615a, rsp = 0x7e7e70ef498, rbp = 0x7e7e70efa10 --- Looking into it, gcc12 seems to discard the __start_set_... and __stop_set_... symbols declared in sys/linker_set.h as __WEAK(), i.e. __asm__(".weak ..."). The following small test shows the problem: --- int main(void) { return (0); } __asm__(".weak __start_set_sdt_providers_set"); static void const * const __set_sdt_providers_set_sym_sdt_provider_tst __attribute__((__section__("set_" "sdt_providers_set"))) __attribute__((__used__)) = &(main); __asm__(".weak __stop_set_sdt_providers_set"); --- When built using system clang: --- $ cc -c -o t.o t.c; nm t.o 0000000000000000 r __set_sdt_providers_set_sym_sdt_provider_tst w __start_set_sdt_providers_set w __stop_set_sdt_providers_set 0000000000000000 T main --- When built using amd64-gcc12: --- $ /usr/local/bin/x86_64-unknown-freebsd14.0-gcc12 -c -o t.o t.c; nm t.o 0000000000000000 r __set_sdt_providers_set_sym_sdt_provider_tst 0000000000000000 T main --- I haven't found any options to tell gcc to stop doing that; any hints?
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a0f626c-95b4-2398-0a6d-9428c440131b>