HOSTCC scripts/mod/file2alias.o HOSTCC scripts/mod/sumversion.o CHK include/generated/asm-offsets.h UPD include/generated/asm-offsets.h CALL scripts/checksyscalls.sh HOSTLD scripts/dtc/dtc /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here collect2: error: ld returned 1 exit status make[2]: *** [scripts/Makefile.host:100:scripts/dtc/dtc] 错误 1 make[1]: *** [scripts/Makefile.build:403:scripts/dtc] 错误 2 make[1]: *** 正在等待未完成的任务.... HOSTLD scripts/genksyms/genksyms HOSTLD scripts/mod/modpost make: *** [Makefile:555:scripts] 错误 2
时间: 2025-04-05 11:05:12 浏览: 34
<think>嗯,用户遇到了一个编译错误,需要我来帮忙分析解决。首先,用户提供的日志中有几个关键点需要注意。让我仔细看看这些信息。
首先,日志中显示在编译过程中出现了链接错误:multiple definition of `yylloc'。这通常意味着在链接阶段有两个或多个目标文件定义了同一个全局变量。具体来说,错误指出`yylloc`在dtc-parser.tab.o和dtc-lexer.lex.o中都被定义了。链接器不允许重复的全局变量定义,所以会报错。
接下来,我需要回忆一下编译过程中flex和bison生成代码时的情况。通常,`yylloc`是Bison生成的分析器用来存储位置信息的变量。如果在lexer(由flex生成)和parser(由bison生成)中都定义了同一个变量,就会导致冲突。可能的原因是生成代码时,两者的协作配置不正确,比如在flex中没有正确声明`yylloc`为外部变量,导致重复定义。
然后,用户使用的编译环境可能有什么问题吗?比如dtc的版本,或者编译器、链接器的设置。另外,检查系统头文件或Makefile中的选项是否有变化,是否启用了某些导致重复定义的编译选项,比如-fno-common可能会让问题更明显。
接下来,可能的解决方案包括:修改flex或bison的输入文件,添加extern声明;或者调整Makefile,确保在生成代码时使用正确的选项,例如在bison中使用`-y`参数或者在flex中使用`%option reentrant`来生成可重入的代码,避免全局变量。另外,检查是否有补丁或更新版本的dtc已经修复了这个问题,可以考虑升级dtc组件。
此外,用户可能是在编译Linux内核时遇到这个问题,因为路径中包含scripts/dtc,而dtc是设备树编译器。这时候可能需要检查内核版本,是否有已知的问题,或者尝试清理编译缓存,重新生成目标文件。
可能的操作步骤包括:清理之前的编译结果,重新编译;手动修改相关文件中的变量声明;或者应用社区中的补丁。另外,查看内核编译的文档或社区讨论,是否有类似问题的解决方案。
总结来说,问题根源在于全局变量`yylloc`被多次定义,需要确保在lexer和parser中该变量只定义一次,其他地方通过extern引用。接下来需要指导用户如何检查相关代码,调整生成文件的配置,或者应用补丁来解决这个问题。</think>从您提供的编译错误信息来看,这是一个典型的**链接器符号重复定义错误**。以下是分步分析及解决方案:
---
### **错误根源分析**
1. **报错关键信息**:
```
multiple definition of `yylloc'; ... first defined here
```
- `yylloc` 是 Bison/Yacc 生成的语法分析器中用于记录词法位置的全局变量。
- 错误原因是该符号在 `dtc-parser.tab.o` 和 `dtc-lexer.lex.o` 两个目标文件中被重复定义。
2. **常见触发场景**:
- Flex(词法分析器生成工具)和 Bison(语法分析器生成工具)协作时,若未正确声明 `yylloc` 的共享性,会导致两者生成代码时各自定义同名全局变量。
---
### **解决方案步骤**
#### 方法1:修改Flex/Bison声明(推荐)
1. **修改Parser文件**(`.y`文件,如 `dtc-parser.y`):
```c
%code requires {
extern YYLTYPE yylloc; // 声明为外部变量
}
```
2. **修改Lexer文件**(`.l`文件,如 `dtc-lexer.l`):
```c
%{
#include "dtc-parser.tab.h" // 确保包含生成的Parser头文件
extern YYLTYPE yylloc; // 显式声明为外部变量
%}
```
#### 方法2:强制使用单一符号定义
在编译时添加 `-fcommon` 选项(适用于GCC):
```bash
# 修改Makefile中对应目标的编译选项
CFLAGS += -fcommon
```
#### 方法3:更新或修复dtc工具
某些旧版dtc存在此已知问题:
```bash
# 清理并重新生成dtc
make clean scripts/dtc
make scripts/dtc
```
---
### **操作验证**
1. **清理编译环境**:
```bash
make clean # 清理所有生成文件
make mrproper # 深度清理(内核编译时推荐)
```
2. **重新编译**:
```bash
make -j$(nproc) scripts/dtc # 单独编译dtc工具
```
---
### **技术背景扩展**
- **HOSTCC**:表示编译主机(Host)环境下的C程序,用于生成构建内核所需的工具。
- **CHK/UPD**:检查/更新生成的头文件(如 `asm-offsets.h`)。
- **链接器错误**:当多个目标文件定义了同名全局符号时,链接器无法确定唯一入口。
---
若问题仍未解决,请提供以下信息:
1. 操作系统及内核版本
2. dtc工具版本(`dtc --version`)
3. 完整的编译命令及环境变量设置
可进一步分析工具链兼容性问题。
阅读全文
相关推荐


















