[build] F: Drop -Wl,--allow-multiple-definition (no longer needed)#75
Closed
esaurez wants to merge 1 commit into
Closed
Conversation
… `-Wl,--allow-multiple-definition` flag was added in the previouscommit to silently coalesce 37 duplicate strong symbols that appearedin BOTH `libnvx_crt0.a` and `libposix.a`: * 34 `__kcall_*` FFI wrappers (`__kcall_lock_mutex`, `__kcall_signal_cond`, `__kcall_send`, ...) * `_do_exit_thread` (thread-exit handler) * `_do_start_thread` (asm thread-bootstrap stub) * `_do_start` (process-entry stub)These have now been resolved structurally upstream: * 36 of 37 by the `sys-ffi` crate split that moves the `#[no_mangle]` FFI exports out of `sys` into a dedicated crate that only `libposix.a` links: nanvix/nanvix#2487. * The remaining `_do_start` by declaring newlib's stub `.weak` so libnvx_crt0's strong SSE-aligned override wins cleanly: nanvix/newlib#17, plus the toolchain image republish in nanvix/toolchain-gcc#14.Once all three of the above have merged and the toolchain image isrepublished with the new newlib commit, the link line no longerneeds `--allow-multiple-definition`.MERGE ORDER: do NOT merge this PR until ALL of the following havelanded: 1. nanvix/nanvix#2487 (sys-ffi crate split) -- already filed. 2. nanvix/newlib#17 (.weak _do_start) -- already filed. 3. nanvix/toolchain-gcc#14 (republish image with new newlib) -- already filed; draft until newlib#17 merges. 4. The toolchain image at ghcr.io/nanvix/toolchain-gcc has been republished from #14 with the new newlib commit. 5. The parent E: PR adding the libnvx_crt0.a wildcard link entry, which this PR is stacked on top of.If merged early, the .so / test ELF link step will fail with"multiple definition of __kcall_*" errors.Validated end-to-end against a locally-rebuilt toolchain imagecarrying the newlib #17 change: the resulting ELF's `_do_start`entry point is libnvx_crt0's SSE-aligned variant (`and $0xfffffff0,%esp ; sub $0x8, %esp ; push ; push ; call _start`) -- the latentSSE-alignment bug present in shipping binaries today is fixed.Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
a2ad98f to
6117813
Compare
a42c8b8 to
45cc9a7
Compare
Author
|
Folded into the simplified main PR #74. The original two-PR design (add the flag in E:, drop it in F:) assumed a transitional period where the link line needed to work both before and after the toolchain image was republished. We're now landing this whole work only after Wave 1 (nanvix/nanvix#2487) + Wave 2 (nanvix/newlib#17 + nanvix/toolchain-gcc#14) have merged and the toolchain image has been republished, so the safety flag was never needed in the first place. The main PR has been rewritten as a single straightforward change that adds libnvx_crt0.a to the test ELF link line without --allow-multiple-definition. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Important
DO NOT MERGE until ALL of the following have landed and propagated:
sys-fficrate split that removes 36 of 37 duplicate strong symbols._do_startin newlib'scrt0.Sso libnvx_crt0's strong override wins (the 37th duplicate).ghcr.io/nanvix/toolchain-gcchas actually been republished from [ci] E: Pin nanvix to v0.12.538 #14 with the new newlib bundled in.libnvx_crt0.awildcard link entry with the safety flag).If merged early, the link step for the test ELF will fail with
multiple definition of __kcall_*errors against the unpatched toolchain image.Summary
Drops
-Wl,--allow-multiple-definitionfrom the test ELF link line. The flag was added by the parent E: PR as a temporary safety guard while 37 duplicate strong symbols were still present in bothlibnvx_crt0.aandlibposix.a. Once those are resolved structurally, the flag is no longer needed and the SSE-aligned_do_startfromlibnvx_crt0.afinally wins at the entry point.Why the flag was needed
libnvx_crt0.aandlibposix.aboth contained byte-identical duplicate strong definitions of:__kcall_*FFI wrappers_do_exit_thread_do_start_thread_do_start(which also collides with newlib's prebuiltcrt0.o)-Wl,--allow-multiple-definitiontoldldto silently take whichever copy it saw first. Since the copies were byte-identical (same Rust source, same--releaseprofile, same compiler), the outcome was semantically equivalent to deduplication -- but the flag also hides legitimate symbol collisions, which is why it was always intended to be temporary.How the duplicates have been resolved
sys-fficrate that owns all#[no_mangle]re-exports ofsys::kcall::*. Onlylibposix.alinkssys-ffi, solibnvx_crt0.ano longer duplicates the__kcall_*/_do_exit_thread/_do_start_threadsymbols._do_startcolliding betweenlibnvx_crt0.aand newlib's prebuiltcrt0.o) -- nanvix/newlib#17 declares newlib's stub.weaksolibnvx_crt0's strong SSE-aligned_do_startwins cleanly without the flag.ghcr.io/nanvix/toolchain-gccso all consumers get the new newlib.Until ALL three changes land AND the toolchain image is republished, this PR's link step will fail. That is why this is a deliberately-separate follow-up PR rather than being squashed into the parent E: PR -- it gives reviewers the option to merge the E: compat fix immediately (preserving backward compatibility with both pre-cutover and post-cutover sysroots, with the safety flag) and circle back to drop the flag in a single small PR once the toolchain catches up.
Side benefit: SSE-aligned
_do_startat the entry pointWith the flag in place,
ldsilently takes newlib's 9-byte unaligned_do_start(crt files come first in the gcc spec). Dropping the flag letslibnvx_crt0's 18-byte SSE-aligned variant -- which aligns%espto a 16-byte boundary before theCALLinstruction, as required by the i386 SysV ABI for SSE-using callees (movaps/movdqa) -- finally win. This fixes a latent SSE-alignment bug present in shipping binaries today.Validation
Built end-to-end against a locally-rebuilt toolchain image carrying the nanvix/newlib#17 change. Test ELF links cleanly without
--allow-multiple-definition. Disassembling the resulting binary confirms_do_startat the entry point is the SSE-aligned variant: