You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链接器无法区分函数与变量?为何不利用ELF符号表类型字段

Why does GCC linker throw "multiple definitions of sth" for a function and variable with the same name?

Great question! Let’s break this down clearly—yes, the ELF format does have a way to distinguish between function (STT_FUNC) and object (STT_OBJECT) symbols via the type field in Elf64_Sym, but the GCC linker (ld) doesn’t use this information to allow duplicate names across symbol types, and there are solid reasons for that.

First, let’s recap your code to set the context:

Module 1:

void sth() { }

Module 2:

int sth = 1;
int func() { }

When you compile each module separately, they work fine—errors only pop up during linking. Here’s why:

1. Linker behavior aligns with C language semantics

In standard C, it’s illegal to have a function and a variable with the same name in the global scope. Even though your definitions are split across two modules, the linker enforces the global namespace rule: all global symbols share a single namespace, regardless of their type. The linker flags sth as a duplicate name first, before checking its type, because the C standard doesn’t allow this scenario in the first place.

2. Historical compatibility drives default behavior

Early linkers (from the a.out format era, predating ELF) didn’t have robust symbol type metadata. GCC’s linker retained this behavior to maintain backward compatibility with legacy code and build systems. Changing the logic to allow type-based name collision resolution would break existing assumptions and potentially introduce subtle, hard-to-debug bugs.

3. Linker prioritizes error prevention over flexibility

While the ELF symbol table has type information, the linker’s default behavior is to flag name collisions as errors because they almost always indicate a bug in your code. Allowing function/variable name overlap could lead to unintended symbol resolution (e.g., a function call resolving to a variable address, which is undefined behavior). The linker doesn’t want to guess your intent here—it’s better to throw an error than let invalid code run.

Can you force the linker to allow this?

Technically, yes—you can use the linker flag --allow-multiple-definition (shortened to -z muldefs), but this is strongly discouraged. The linker will just pick one of the symbols (usually the last one encountered) and discard the other, which will almost certainly lead to crashes or unexpected behavior. This is not a solution—it’s a workaround for bad code.

Bottom line

The linker isn’t incapable of distinguishing function and variable types—it’s choosing not to, because doing so would violate C language rules and introduce unnecessary risk. The error message is helping you fix a code issue that’s invalid in standard C.

内容的提问来源于stack exchange,提问作者user9623401

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:13:15