File tree Expand file tree Collapse file tree 1 file changed +18
-1
lines changed
Expand file tree Collapse file tree 1 file changed +18
-1
lines changed Original file line number Diff line number Diff line change @@ -79,7 +79,9 @@ int config = 10;
7979int 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完成后,运行测试来验证:
You can’t perform that action at this time.
0 commit comments