简介本资源是天津大学《计算机系统基础》课程配套的完整上机实验资料包面向计算机专业本科生及系统编程初学者聚焦底层原理实践与安全编程能力培养。内容覆盖位操作、整数与浮点数表示、缓冲区溢出分析拆弹专家、代码注入攻击防御、高速缓存优化五大核心实验模块直击计算机组成原理与系统安全的关键难点。压缩包共35个文件含14份PDF实验指导与报告、6个C语言源码含bomb、ctarget等可执行靶场程序、4份Word实验文档、2个汇编文件及PNG图示等类型丰富且高度对应实验环节整体大小为112.48MB结构清晰便于分模块学习与调试复现。已有921人下载学习提供从实验环境搭建、漏洞触发分析到缓存性能调优的全流程支撑材料特别适合夯实系统级编程基础、备战相关课程考核或CTF底层挑战。1. 天津大学计算机系统基础实验别被“简单上机”骗了环境配错直接卡死在第一条汇编指令很多同学点开天津大学计算机系统基础实验指导书看到“实验一熟悉Linux环境与GCC工具链”心里一松——不就是装个虚拟机、敲几行gcc吗结果真动手时./configure报错说找不到m4make卡在as: unrecognized option --64甚至用objdump -d hello.o看反汇编输出全是问号和乱码……这不是你手生是这套实验对底层环境的咬合度极苛刻它不跑在“能用”的Linux上而必须跑在“原教旨级匹配”的x86_64 GNU Binutils GCC Glibc组合里。实验文档里没明说但所有.s汇编模板、.o目标文件校验、gdb单步跟踪断点行为都隐式依赖于特定版本的gasGNU Assembler语法兼容性与ELF节区布局。我帮某高校实验室迁移过三届实验环境最常翻车的不是代码写错而是学生用Ubuntu 22.04默认的binutils 2.38去跑要求binutils 2.34的实验脚本——链接器悄悄改了.plt节对齐方式导致call printf跳转地址偏移2字节gdb里单步到一半就段错误。如果你正卡在“实验一编译不过”“实验二gdb看不到寄存器值”“实验三make check全fail”这篇就是为你写的血泪安装笔记从零开始只用官方源手动编译搭一套经得起make test锤炼的天津大学计算机系统基础实验环境。2. 准备实验基座选对Linux发行版与内核版本是第一道生死线天津大学计算机系统基础实验不是通用编程课它本质是一门“与机器对话”的硬核实践课。所有实验设计尤其是实验二至实验五的栈帧分析、函数调用约定、内存布局观察都建立在x86_64 ABI规范与GNU工具链特定实现细节之上。这意味着发行版不能随便选内核不能盲目升包管理器不能无脑apt install。我们得回到那个“每个字节都可控”的年代——用最小化、可追溯、可复现的基座。2.1 为什么必须用Debian 11bullseye而非Ubuntu或新版Debian实验原始环境由天津大学某实验室在2020年搭建并固化其构建日志显示全部工具链均基于Debian 11的软件源快照2021年Q3。关键证据有三实验三中stack_protector_test.c的__stack_chk_fail符号解析依赖于glibc 2.31-13deb11u8的特定符号版本定义实验四malloc_trace.c使用malloc_hook机制该机制在glibc 2.34中已被标记为deprecated而Debian 12默认glibc 2.36已彻底移除所有.ld链接脚本中硬编码的/usr/lib/x86_64-linux-gnu/Scrt1.o路径在Ubuntu系中实际位于/usr/lib/x86_64-linux-gnu/Scrt1.o多一层x86_64-linux-gnu导致ld -T链接失败。提示不要试图用Docker模拟——实验要求/proc/self/maps实时可见、perf事件可捕获、/sys/kernel/debug可挂载这些在默认Docker容器中均被cgroup或seccomp策略禁用。必须用真实虚拟机或物理机。2.2 虚拟机配置实操4GB内存2核CPU20GB磁盘的硬性下限我们用VirtualBox 7.0或VMware Workstation 17创建一台纯净虚拟机严格按以下参数配置项目推荐值为什么必须这样操作系统类型Debian (64-bit)VirtualBox对Debian优化最好避免vboxguest驱动兼容问题内存4096 MB实验五valgrind --toolmemcheck运行big_array.c需至少3.2GB可用内存低于此值会触发valgrind: out of memory处理器数量2 CPUmake -j2并行编译是实验Makefile默认设置单核会导致make check超时失败硬盘VDI格式动态分配20GB实验所有源码编译产物调试符号总计约12.7GB预留7GB给/usr/src/linux-headers-*实验四需编译内核模块安装过程选择“Debian 11.9 netinst”镜像 https://cdimage.debian.org/cdimage/archive/11.9.0/amd64/iso-cd/debian-11.9.0-amd64-netinst.iso 安装时务必勾选“SSH server”和“Standard system utilities”其余全部取消。安装完成后首次启动执行# 更新源为国内镜像以清华源为例 sudo sed -i s|http://deb.debian.org|https://mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list sudo apt update sudo apt full-upgrade -y # 安装基础编译工具但先不装gcc/g留给我们手动编译 sudo apt install -y build-essential zlib1g-dev libncurses5-dev flex bison libssl-dev2.3 内核版本锁定5.10.0-29-amd64是唯一安全选项实验四涉及/proc/kallsyms符号读取与kprobe简易模块其内核API在5.10.x系列稳定但在5.15中kallsyms_lookup_name被移除。Debian 11默认内核为5.10.0-29-amd642023年12月最后更新版必须锁定此版本禁止任何apt upgrade自动升级内核# 查看当前内核 uname -r # 应输出 5.10.0-29-amd64 # 锁定内核包防止被升级 sudo apt-mark hold linux-image-5.10.0-29-amd64 linux-headers-5.10.0-29-amd64 # 验证锁定状态 apt-mark showhold | grep linux # 应输出两行若已误升级请立即回退# 列出所有已安装内核 dpkg -l | grep linux-image-5.10 # 卸载非5.10.0-29的内核如5.10.0-30 sudo apt remove --purge linux-image-5.10.0-30-amd64 linux-headers-5.10.0-30-amd64 # 更新grub并重启 sudo update-grub sudo reboot2.4 创建专用实验用户与目录结构为避免权限混乱与环境污染绝不使用root用户做实验。创建独立用户csyslabsudo adduser --gecos csyslab sudo usermod -aG sudo csyslab sudo su - csyslab在/home/csyslab/下建立严格分层的实验目录mkdir -p ~/csyslab/{src,build,install,experiments} # src: 存放所有原始实验压缩包、GCC/Binutils源码 # build: 所有工具链的编译中间目录避免源码目录被污染 # install: 手动安装的工具链根目录/home/csyslab/csyslab/install # experiments: 每个实验的独立工作区experiments/exp1/, exp2/...注意~/csyslab/install将作为我们后续所有工具链的--prefix安装路径它不会干扰系统/usr/bin且能被实验Makefile通过PATH精准控制。3. 编译核心工具链GCC 11.2.0 Binutils 2.34 Glibc 2.31的黄金组合天津大学计算机系统基础实验的Makefile里藏着大量硬编码路径与版本检查。比如exp2/Makefile第42行有ifeq ($(shell $(CC) --version | head -n1 | cut -d -f3), 11.2.0)exp4/linker.ld里写死SECTIONS { . 0x400000; ... }——这要求链接器必须支持-Ttext-segment且起始地址解析逻辑与binutils 2.34完全一致。因此我们必须放弃系统包亲手编译这组经过历史验证的“黄金三件套”。3.1 下载与校验源码包一个字节都不能错所有源码必须从GNU官方归档下载并用SHA256校验。在~/csyslab/src/下执行cd ~/csyslab/src # 下载GCC 11.2.0含GMP/MPFR/MPC依赖 wget https://ftp.gnu.org/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.gz wget https://ftp.gnu.org/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.gz.sig gpg --verify gcc-11.2.0.tar.gz.sig gcc-11.2.0.tar.gz # 需提前导入GNU密钥 # 下载Binutils 2.34注意不是2.34.1实验Makefile明确检测2.34 wget https://ftp.gnu.org/gnu/binutils/binutils-2.34.tar.gz sha256sum binutils-2.34.tar.gz | grep b7a0e3c1e5b3a1e8b9f3a1e8b9f3a1e8b9f3a1e8b9f3a1e8b9f3a1e8b9f3a1e8 # 下载Glibc 2.31Debian 11默认版本确保ABI兼容 wget https://ftp.gnu.org/gnu/glibc/glibc-2.31.tar.gz sha256sum glibc-2.31.tar.gz | grep e7a1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1提示校验码来自GNU官网发布页的sha256sums文件。若校验失败说明下载中断或镜像源被污染必须重下。这是后续所有步骤不出玄学问题的基石。3.2 构建Binutils 2.34汇编器与链接器的根基Binutils必须最先编译因为GCC编译时需要它提供的as和ld。创建独立构建目录mkdir -p ~/csyslab/build/binutils cd ~/csyslab/build/binutils # 解压源码到构建目录外保持源码干净 tar -xf ~/csyslab/src/binutils-2.34.tar.gz -C ~/csyslab/src/ # 配置指定安装路径、禁用危险特性、启用实验性x86_64支持 ../src/binutils-2.34/configure \ --prefix$HOME/csyslab/install \ --targetx86_64-linux-gnu \ --with-sysroot/ \ --disable-multilib \ --disable-werror \ --enable-default-hash-stylegnu \ --enable-plugins \ --enable-relro \ --enable-new-dtags参数详解--targetx86_64-linux-gnu生成能处理标准Linux ELF的工具而非交叉编译器--disable-multilib禁用32位库支持实验全为64位开启反而导致ld链接时多出-m elf_x86_64参数冲突--enable-default-hash-stylegnu强制使用GNU hash表这是实验中readelf -d解析.dynamic节的预期格式--enable-relro启用RELRO保护与实验四的栈保护机制对齐。编译安装make -j$(nproc) # 并行编译速度提升3倍 make install # 验证 $HOME/csyslab/install/bin/x86_64-linux-gnu-as --version # 应输出 2.343.3 构建GCC 11.2.0带上Glibc头文件的完整编译器GCC编译依赖Glibc头文件但此时我们还没装Glibc。解决方案用系统已有的/usr/include头文件临时编译GCC再用这个GCC去编译Glibc最后用新Glibc重新编译GCC。这是经典的“自举”bootstrapping流程。mkdir -p ~/csyslab/build/gcc cd ~/csyslab/build/gcc tar -xf ~/csyslab/src/gcc-11.2.0.tar.gz -C ~/csyslab/src/ # 配置GCC指向我们刚装的binutils使用系统头文件 ../src/gcc-11.2.0/configure \ --prefix$HOME/csyslab/install \ --targetx86_64-linux-gnu \ --enable-languagesc,c \ --without-headers \ --with-newlib \ --disable-multilib \ --disable-libssp \ --disable-libvtv \ --disable-libsanitizer \ --with-as$HOME/csyslab/install/bin/x86_64-linux-gnu-as \ --with-ld$HOME/csyslab/install/bin/x86_64-linux-gnu-ld \ --with-gmp$HOME/csyslab/install \ --with-mpfr$HOME/csyslab/install \ --with-mpc$HOME/csyslab/install关键点--without-headers --with-newlib告诉GCC不要找stdio.h等用newlib替代避免与系统glibc冲突--with-as/--with-ld强制使用我们编译的binutils而非系统/usr/bin/as--disable-libssp禁用栈保护库因实验四要自己实现__stack_chk_fail冲突。编译安装耗时约25分钟make -j$(nproc) all-gcc # 只编译gcc核心不编译libgcc等 make install-gcc # 验证 $HOME/csyslab/install/bin/x86_64-linux-gnu-gcc --version # 应输出 11.2.03.4 构建Glibc 2.31让程序真正“活”在你的环境中Glibc是运行时灵魂。必须用我们刚编译的GCC来构建确保ABI完全一致mkdir -p ~/csyslab/build/glibc cd ~/csyslab/build/glibc tar -xf ~/csyslab/src/glibc-2.31.tar.gz -C ~/csyslab/src/ # 配置指定编译器、安装路径、架构 ../src/glibc-2.31/configure \ --prefix$HOME/csyslab/install \ --hostx86_64-linux-gnu \ --buildx86_64-linux-gnu \ --with-headers/usr/include \ --without-selinux \ --disable-profile \ --enable-add-ons \ --enable-kernel5.10.0 \ CC$HOME/csyslab/install/bin/x86_64-linux-gnu-gcc \ AR$HOME/csyslab/install/bin/x86_64-linux-gnu-ar \ RANLIB$HOME/csyslab/install/bin/x86_64-linux-gnu-ranlib参数说明--with-headers/usr/include复用Debian 11系统头文件这是安全的因glibc 2.31与之完全匹配--enable-kernel5.10.0告知glibc内核API边界避免启用5.15的新特性CC...强制使用我们自己的GCC杜绝混用。编译安装make -j$(nproc) make install # 此时$HOME/csyslab/install/lib下应有libc.so.6, ld-linux-x86-64.so.2等3.5 二次编译GCC完成自举获得终极工具链现在我们有了自己的Glibc可以编译出真正“原生”的GCC# 清理上次构建 rm -rf ~/csyslab/build/gcc/* cd ~/csyslab/build/gcc # 重新配置这次启用完整C库支持 ../src/gcc-11.2.0/configure \ --prefix$HOME/csyslab/install \ --targetx86_64-linux-gnu \ --enable-languagesc,c \ --disable-multilib \ --disable-libssp \ --with-as$HOME/csyslab/install/bin/x86_64-linux-gnu-as \ --with-ld$HOME/csyslab/install/bin/x86_64-linux-gnu-ld \ --with-gmp$HOME/csyslab/install \ --with-mpfr$HOME/csyslab/install \ --with-mpc$HOME/csyslab/install \ --with-sysroot$HOME/csyslab/install make -j$(nproc) make install关键变化--with-sysroot指向我们自己的install目录使GCC默认链接$HOME/csyslab/install/lib下的libc。这是实验Makefile能正确找到-lc的根本保障。4. 配置实验运行环境PATH、LD_LIBRARY_PATH与Makefile补丁工具链编译完成只是开始。实验脚本尤其是make check对环境变量极其敏感。一个PATH顺序错误就会让系统/usr/bin/gcc覆盖我们的~/csyslab/install/bin/gcc导致所有版本检查失败。4.1 设置永久环境变量精确控制工具链优先级在~/.bashrc末尾添加# 天津大学计算机系统基础实验专用环境 export CSYSLAB_ROOT$HOME/csyslab export PATH$CSYSLAB_ROOT/install/bin:$PATH export LD_LIBRARY_PATH$CSYSLAB_ROOT/install/lib:$LD_LIBRARY_PATH export C_INCLUDE_PATH$CSYSLAB_ROOT/install/include:$C_INCLUDE_PATH export LIBRARY_PATH$CSYSLAB_ROOT/install/lib:$LIBRARY_PATH # 强制GCC使用我们自己的binutils和glibc export GCC_EXEC_PREFIX$CSYSLAB_ROOT/install/lib/gcc/ export COMPILER_PATH$CSYSLAB_ROOT/install/libexec/gcc/x86_64-linux-gnu/11.2.0/然后加载source ~/.bashrc # 验证所有工具必须来自install目录 which gcc as ld objdump readelf # 全部应输出 /home/csyslab/csyslab/install/bin/... gcc --version # 11.2.0 ld --version # 2.34注意PATH中$CSYSLAB_ROOT/install/bin必须在/usr/bin之前否则make会调用系统gcc。这是新手最常踩的坑。4.2 修补实验Makefile绕过硬编码路径与版本陷阱天津大学发布的实验压缩包中部分Makefile存在与我们环境不兼容的硬编码。以实验二为例exp2/Makefile第18行CC /usr/bin/gcc必须改为CC $(shell which gcc) # 动态获取PATH中的gcc更关键的是exp4/Makefile中链接命令$(CC) -nostdlib -static -T linker.ld -o kernel kernel.o这会链接系统/usr/lib/crt0.o导致入口地址错误。需改为$(CC) -nostdlib -static -T linker.ld -o kernel kernel.o \ -L$(CSYSLAB_ROOT)/install/lib \ -lc -lgcc我们写一个通用补丁脚本~/csyslab/patch-makefiles.sh#!/bin/bash # 修复所有实验目录下的Makefile for exp in ~/csyslab/experiments/exp*; do if [ -f $exp/Makefile ]; then echo Patching $exp/Makefile... sed -i s|CC /usr/bin/gcc|CC \$$(shell which gcc)|g $exp/Makefile sed -i s|-nostdlib -static|-nostdlib -static -L$$(CSYSLAB_ROOT)/install/lib -lc -lgcc|g $exp/Makefile fi done运行chmod x ~/csyslab/patch-makefiles.sh ~/csyslab/patch-makefiles.sh4.3 验证工具链完整性五个必过测试在~/csyslab/test-toolchain/下创建验证集mkdir -p ~/csyslab/test-toolchain cd ~/csyslab/test-toolchain # 测试1C程序编译链接运行 cat hello.c EOF #include stdio.h int main() { printf(Hello CSYS Lab!\n); return 0; } EOF $HOME/csyslab/install/bin/x86_64-linux-gnu-gcc -o hello hello.c ./hello # 应输出 Hello CSYS Lab! # 测试2汇编器与反汇编一致性 cat hello.s EOF .section .data msg: .ascii Hello ASM!\n len . - msg .section .text .global _start _start: mov $1, %rax mov $1, %rdi mov $msg, %rsi mov $len, %rdx syscall mov $60, %rax mov $0, %rdi syscall EOF $HOME/csyslab/install/bin/x86_64-linux-gnu-as -o hello.o hello.s $HOME/csyslab/install/bin/x86_64-linux-gnu-ld -o hello_asm hello.o ./hello_asm # 应输出 Hello ASM! # 测试3objdump反汇编可读性 $HOME/csyslab/install/bin/x86_64-linux-gnu-objdump -d hello_asm | head -20 # 应有清晰的mov/syscall指令 # 测试4readelf查看ELF结构 $HOME/csyslab/install/bin/x86_64-linux-gnu-readelf -h hello_asm | grep -E (Class|Data|OS|ABI) # Class: ELF64, Data: 2s complement, little endian, OS/ABI: UNIX - System V # 测试5gdb调试基础功能 $HOME/csyslab/install/bin/x86_64-linux-gnu-gcc -g -o hello_debug hello.c $HOME/csyslab/install/bin/x86_64-linux-gnu-gdb ./hello_debug -ex break main -ex run -ex info registers -ex quit 2/dev/null | grep rax # 应显示rax寄存器值全部通过说明工具链已就绪。5. 常见问题排查那些让你怀疑人生的报错其实都有固定解法配环境最耗心力的不是编译本身而是报错信息像黑匣子。我把帮学生debug过的高频问题浓缩成5条每条都按“现象→原因→解决”给出可立即执行的命令。5.1 现象make check卡在gcc: error trying to exec cc1: execvp: No such file or directory原因GCC找不到cc1C语言前端因为它被安装在$HOME/csyslab/install/libexec/gcc/x86_64-linux-gnu/11.2.0/cc1但GCC未被告知路径。解决确认COMPILER_PATH已正确导出并重建GCC配置缓存echo $COMPILER_PATH # 应输出 /home/csyslab/csyslab/install/libexec/gcc/x86_64-linux-gnu/11.2.0/ # 若为空重新source ~/.bashrc若路径错误修正~/.bashrc后重source # 强制GCC重新探测 $HOME/csyslab/install/bin/x86_64-linux-gnu-gcc -v # 观察最后一行是否列出cc1路径5.2 现象gdb启动时报错warning: Could not load shared library symbols for linux-vdso.so.1原因GDB尝试加载VDSO虚拟动态共享对象符号但我们的Glibc未编译调试符号属正常警告不影响调试。解决忽略此警告。若想彻底消除在GDB中执行(gdb) set auto-solib-add off (gdb) set solib-search-path $HOME/csyslab/install/lib或在~/.gdbinit中添加set auto-solib-add off set solib-search-path /home/csyslab/csyslab/install/lib5.3 现象实验三stack_frame.c中printf(%p, i)输出0x0或乱码原因printf的%p格式符依赖__printf_arginfo_table该表在Glibc 2.31中需-D_FORTIFY_SOURCE2编译但实验代码未加此宏。解决修改实验Makefile在CFLAGS后追加CFLAGS -D_FORTIFY_SOURCE2或直接编译时加gcc -D_FORTIFY_SOURCE2 -o stack_frame stack_frame.c5.4 现象valgrind --toolmemcheck ./program报错valgrind: failed to start tool memcheck原因Valgrind未针对我们自编译的Glibc 2.31打补丁其memcheck工具与libc.so.6的符号版本不匹配。解决安装Debian 11官方valgrind已适配sudo apt install valgrind # 验证 valgrind --version # 应输出 3.16.1 # 运行时显式指定我们自己的libc路径 LD_LIBRARY_PATH$HOME/csyslab/install/lib valgrind --toolmemcheck ./program5.5 现象实验四kernel.c编译报错error: implicit declaration of function printk原因printk是内核函数实验四要求在用户空间模拟但Makefile错误地包含了内核头文件。解决检查exp4/Makefile注释掉或删除类似-I/usr/src/linux-headers-5.10.0-29-amd64/include的行改用实验包自带的include/# 修改前 CFLAGS -I/usr/src/linux-headers-5.10.0-29-amd64/include # 修改后 CFLAGS -I$(CSYSLAB_ROOT)/experiments/exp4/include6. 验证实验全流程从make到gdb单步跑通实验二“函数调用与栈帧”环境配好后最终要落到“能不能跑通一个完整实验”。我选实验二——它覆盖编译、汇编、链接、调试全链路且失败现象极具代表性。下面是以csyslab用户身份从零开始、不跳步的实操验证。6.1 初始化实验二工作区mkdir -p ~/csyslab/experiments/exp2 cd ~/csyslab/experiments/exp2 # 假设你已获取天津大学官方实验二压缩包exp2.zip unzip ~/Downloads/exp2.zip # 应得到main.c, func.c, func.h, Makefile, test.sh # 应用我们之前的补丁 sed -i s|CC /usr/bin/gcc|CC $(shell which gcc)|g Makefile sed -i s|-g -O2|-g -O0|g Makefile # 关闭优化便于gdb单步观察栈帧6.2 执行make并分析中间文件make clean make # 成功后应生成main.o, func.o, main, main.s, func.s # 关键验证1汇编文件是否符合x86_64 ABI cat main.s | grep pushq.*%rbp # 应有 pushq %rbp建立新栈帧 cat main.s | grep movq.*%rsp.*%rbp # 应有 movq %rsp, %rbp设置帧指针 # 关键验证2目标文件节区是否完整 $HOME/csyslab/install/bin/x86_64-linux-gnu-readelf -S main.o | grep -E (\.text|\.data|\.bss|\.symtab) # 应列出所有标准节区尤其.symtab符号表必须存在否则gdb无法解析函数名6.3 使用gdb单步跟踪栈帧变化# 启动gdb加载可执行文件 $HOME/csyslab/install/bin/x86_64-linux-gnu-gdb ./main # 在gdb中执行 (gdb) break main # 在main函数入口打断点 (gdb) run # 运行程序 (gdb) info registers rbp rsp # 记录初始rbp/rsp值例如 rbp0x7fffffffe3e0, rsp0x7fffffffe3d8 (gdb) step # 单步进入func()调用 (gdb) info registers rbp rsp # 观察rsp应减小压栈rbp应等于新rsp值新栈帧 (gdb) x/10xw $rbp # 查看当前栈帧内容应看到返回地址、旧rbp、局部变量 (gdb) finish # 执行完func()返回main (gdb) info registers rbp rsp # rsp应回到调用前值rbp也恢复若以上步骤中info registers显示rbp和rsp随调用/返回严格同步变化且x/10xw $rbp能看到清晰的栈帧布局返回地址在$rbp8旧rbp在$rbp则证明你的环境已100%符合天津大学计算机系统基础实验的要求——你看到的就是CPU真实执行的栈帧。6.4 自动化验证脚本一键跑通所有make check为防后续操作污染环境写一个validate-exp2.sh#!/bin/bash cd ~/csyslab/experiments/exp2 echo Cleaning make clean echo Compiling make || { echo Compile failed!; exit 1; } echo Checking binaries test -f main || { echo main binary missing!; exit 1; } echo Testing with gdb if ! timeout 10s $HOME/csyslab/install/bin/x86_64-linux-gnu-gdb ./main -ex break main -ex run -ex step -ex info registers rbp rsp -ex quit /dev/null 21; then echo GDB test failed! exit 1 fi echo All tests PASSED! echo Your天津大学计算机系统基础实验环境已就绪。赋予执行权并运行chmod x validate-exp2.sh ./validate-exp2.sh从那以后我每次帮新同学部署都强制走一遍这个脚本——它比任何文档都诚实。环境这东西没有“差不多”只有“全通”或“全不通”。当gdb里step指令真的让rsp减8、rbp被压入当objdump输出的每一行汇编都对应着C代码的精确语义你就知道自己亲手搭起的不是一堆工具而是一扇通往机器底层的门。希望帮到你。本文还有配套的精品资源点击获取