Skip to content

Commit c2f7f83

Browse files
committed
docs(task4): specify error message formats for symbol resolution
1 parent 73de3fd commit c2f7f83

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

docs/task4.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ int config = 10;
7979
int config = 20;
8080
```
8181

82-
这显然是一个错误。两个模块都明确地定义了`config`,但它们的值不同。链接器无法也不应该猜测应该用哪个。此时应该报错:`Multiple definition of strong symbol: config`
82+
这显然是一个错误。两个模块都明确地定义了`config`,但它们的值不同。链接器无法也不应该猜测应该用哪个。此时你的链接器应该向标准错误输出报错信息,格式为:Multiple definition of strong symbol: <符号名>
83+
84+
> 例如:Multiple definition of strong symbol: global_var
8385
8486
**情况二:普通定义遇到弱定义**
8587

@@ -133,6 +135,21 @@ static int counter = 0; // 只在bar.c内可见
133135
> [!IMPORTANT]
134136
> 在真实代码中,你会遇到一些编译器自动生成的局部符号,比如`.LC0``.LC1`这样的字符串常量标签。不同文件可能生成同名的标签,但它们指向的是不同的字符串。这也是需要通过前缀区分的情况。
135137
138+
## 未定义符号的处理
139+
140+
到目前为止,我们假设每个被引用的符号都能在某个目标文件中找到定义。但现实中由于各种各样的原因,链接器可能在链接过程中无法找到某个符号的定义。例如,用户可能忘记链接某个目标文件。
141+
142+
当你的链接器完成所有符号决议后,如果发现仍有未解析的符号引用,应该向标准错误输出报错信息,格式为:`Undefined symbol: <符号名>`
143+
144+
> 例如:`Undefined symbol: _local_var`
145+
146+
> [!TIP]
147+
> 测试脚本采用较为宽松的匹配方式,只要检测到 `stderr` 中的某一行包含符合格式的字符串即认为测试通过。你可以:
148+
> - 通过 `throw std::runtime_error(err_message)` 抛出异常,实验框架会自动捕获并输出错误信息到标准错误流
149+
> - 直接向 `stderr` 输出错误信息(使用 `std::cerr``fprintf`),然后调用 `exit(1)` 中止程序
150+
151+
---
152+
136153
现在,请在`src/student/ld.cpp`中实现这些符号决议规则。你可能需要修改符号表的设计,添加一些辅助函数来判断符号类型和应用决议逻辑。
137154

138155
完成后,运行测试来验证:

0 commit comments

Comments
 (0)