diff --git a/build.py b/build.py index e441b7b..c713b1e 100644 --- a/build.py +++ b/build.py @@ -1,5 +1,6 @@ import shutil import os +import re import sys import subprocess import threading @@ -39,11 +40,19 @@ if os.path.exists(p2c_bat): if "ld.lld" in low and (".bin" in low or "output" in low): link_line = line.rstrip("\r\n") if link_line is not None: - elf_line = link_line.replace("--oformat binary", "").replace("--strip-all", "") - elf_line = elf_line.replace("kernel.bin", "kernel.elf") - print("[build] linking kernel.elf for analysis ...") - if os.system(elf_line) != 0: - print("[build] 警告: kernel.elf 链接失败(不影响 kernel.bin)") + # 稳健改写:--oformat 可能是 "--oformat binary" 或 "--oformat=binary";输出可能是 + # "-o " 或 "--output="。任一没匹配上就放弃(绝不去执行原样命令,否则会把 + # kernel.bin 覆盖成非预期产物)。 + elf_line = re.sub(r"--oformat[ =]binary", "", link_line) + elf_line = re.sub(r"--strip-all", "", elf_line) + elf_line = re.sub(r"(-o\s+)\S+", r"\1" + kernel_elf, elf_line) + elf_line = re.sub(r"(--output=)\S+", r"\1" + kernel_elf, elf_line) + if elf_line == link_line or kernel_elf not in elf_line: + print("[build] 警告: 未能改写链接命令,跳过 kernel.elf(避免误覆盖 kernel.bin)") + else: + print("[build] linking kernel.elf for analysis ...") + if os.system(elf_line) != 0: + print("[build] 警告: kernel.elf 链接失败(不影响 kernel.bin)") else: print("[build] 警告: 未从 phase2command 取到链接命令,跳过 kernel.elf")