Skip to content

#[thread_local] + #[no_mangle] produces a "symbol already defined" error on Windows targets #134939

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
saethlin opened this issue Dec 30, 2024 · 2 comments
Labels
A-thread-locals Area: Thread local storage (TLS) C-bug Category: This is a bug. F-thread_local `#![feature(thread_local)]` O-windows Operating system: Windows T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@saethlin
Copy link
Member

saethlin commented Dec 30, 2024

#![feature(thread_local)]

#[no_mangle]
#[thread_local]
pub static FOO: u32 = 3;

Does not compile on x86_64-pc-windows-msvc and x86_64-pc-windows-gnu, due to:

error: symbol `FOO` is already defined
 --> lib.rs:5:1
  |
5 | pub static FOO: u32 = 3;
  | ^^^^^^^^^^^^^^^^^^^

error: aborting due to 1 previous error

Found this while working on #134777

@saethlin saethlin added A-thread-locals Area: Thread local storage (TLS) C-bug Category: This is a bug. F-thread_local `#![feature(thread_local)]` O-windows Operating system: Windows T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Dec 30, 2024
@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Dec 30, 2024
@Noratrieb Noratrieb removed the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Dec 30, 2024
@bjorn3
Copy link
Member

bjorn3 commented Dec 31, 2024

Without #[no_mangle] this produces:

@_ZN7example3FOO17h7f7f943ccbcbfc68E = thread_local constant <{ [4 x i8] }> <{ [4 x i8] c"\03\00\00\00" }>, align 4
@"\01__imp__ZN7example3FOO17h7f7f943ccbcbfc68E" = global ptr @_ZN7example3FOO17h7f7f943ccbcbfc68E

; example::FOO{{tls.shim}}
; Function Attrs: nounwind uwtable
define align 4 ptr @"_ZN7example31FOO$u7b$$u7b$tls.shim$u7d$$u7d$17he869035d025446a1E"() unnamed_addr #0 !dbg !6 {
start:
  ret ptr @_ZN7example3FOO17h7f7f943ccbcbfc68E, !dbg !11
}

My guess would be that #[no_mangle] disables mangling not just for _ZN7example3FOO17h7f7f943ccbcbfc68E, but also for \01__imp__ZN7example3FOO17h7f7f943ccbcbfc68E and/or _ZN7example31FOO$u7b$$u7b$tls.shim$u7d$$u7d$17he869035d025446a1E.

@ChrisDenton
Copy link
Member

The implementation of #[no_mangle] and #[thread_local] are in the realm of the compiler so this isn't a libs issue.

@ChrisDenton ChrisDenton added T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. and removed T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jan 24, 2025
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-thread-locals Area: Thread local storage (TLS) C-bug Category: This is a bug. F-thread_local `#![feature(thread_local)]` O-windows Operating system: Windows T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

5 participants