`serial.puts` 这类模块属性指向的是函数(elf.vp 的 _resolve_symbol 返回它作 函数指针),属性兜底路径却为它造了一个 llvm.mlir.global external @<sha1>.puts, 与已有的 llvm.func @<sha1>.puts 同名,mlir-opt 报 redefinition of symbol named。 改为在伪造之前先精确匹配函数符号(目标模块 sha1 前缀过的函数名与 Function.Name 逐字符相等,避免误命中他模块同名函数),命中则返回函数符号引用本身 (@<mangled>,类型 Ptr(Func),与同模块 &f 分支同一形态),并让属性读路径跳过 对该值的 load(函数地址即值,load 会去读函数体)。 EOF