栈堆静态区映射区

共 18 题
#

1. .bss 段为何在 ELF 中只占 size 而非数据?

A .bss 段太大,无法存进文件
B .bss 段变量全为 0,无需存储实际数据,加载时统一清零即可 ✓ 正确答案
C .bss 段由内核运行时动态产生,与 ELF 无关
D .bss 段存放的是代码而非数据
#

2. ELF 中 .text / .data / .bss / .rodata 段的作用?

A .rodata 存放只读常量,权限为只读 ✓ 正确答案
B .text 存放可写的全局变量
C .bss 存放已初始化的非零全局变量
D .data 存放可执行代码
#

3. Linux /proc/self/maps 中 [stack] 段的权限与范围?

A [stack] 权限为 r-x(可执行)
B [stack] 是主线程栈,权限为 rw-p,栈向下增长 ✓ 正确答案
C [stack] 的大小固定为 8MB,不会变化
D 所有线程的栈都标记为 [stack]
#

4. init 与 fini 数组在 ELF 加载时如何触发 constructor/destructor?

A 动态链接器仅在进程退出时遍历 .init_array
B .init_array 存放的是可执行代码而非函数指针
C 加载时遍历 .init_array 调用构造函数,卸载时遍历 .fini_array 调用析构函数 ✓ 正确答案
D 构造函数由内核直接调用,与链接器无关
#

5. mmap 区在进程虚拟地址中的位置与共享库加载关系?

A mmap 区位于代码段内部,与堆重叠
B 共享库总是加载到固定地址,不受 ASLR 影响
C mmap 区不能承载匿名映射
D 共享库通过 mmap 映射到堆与栈之间的 mmap 区 ✓ 正确答案
#

6. alloca/VLA 在栈上动态分配的原理与风险,为什么大尺寸 alloca 容易触发栈溢出,与 malloc 堆分配的本质差异如何?

A alloca 在堆上分配,需显式 free
B alloca 在栈上分配、随函数返回自动释放,但大尺寸易触发栈溢出 ✓ 正确答案
C alloca 与 malloc 完全等价
D alloca 分配的内存可以跨函数长期使用
#

7. stack 与 heap 在进程虚拟地址空间的相对位置?

A 栈与堆的位置是固定的,不随地址布局变化
B 栈在低地址向上增长,堆在高地址向下增长
C 两者都从低地址向高地址增长
D 栈在高地址向下增长,堆在低地址向上增长 ✓ 正确答案
#

8. 为何 C 全局数组未初始化值默认为 0(bss 段)?

A 因为编译器在运行时为每个变量调用 memset
B 未初始化局部变量也默认为 0
C 未初始化全局变量存放在 .bss 段,加载时被清零 ✓ 正确答案
D 因为栈上的内存总是清零的
#

9. Linux 中 stack 的 RLIMIT_STACK(默认 8MB)与动态扩展?

A 栈按需缺页动态扩展,到 RLIMIT_STACK 上限后越过 guard page 触发 SIGSEGV ✓ 正确答案
B 栈在启动时一次性分配全部 8MB 物理内存
C RLIMIT_STACK 无法被修改
D 栈溢出不会报错,会静默继续
#

10. 为何 stack 由 OS 自动管理而 heap 由用户管理?

A 栈的 LIFO 特性使其分配释放规律,可自动管理;堆分配任意需显式管理 ✓ 正确答案
B 栈分配需要遍历自由列表,开销大
C 堆也是 LIFO,因此也由 OS 自动管理
D 栈和堆都由用户通过 malloc/free 管理
#

11. 进程地址空间布局,栈、堆、数据段、代码段的典型布局如何?

A 栈、堆、数据段、代码段
B 堆、代码段、栈、数据段
C 代码段、数据段、堆、mmap 区、栈 ✓ 正确答案
D 数据段、代码段、栈、堆
#

12. 栈帧结构,局部变量、返回地址与参数传递如何组织?

A 栈帧中只包含局部变量,不含返回地址
B 调用指令会把返回地址压入栈,栈帧包含参数、返回地址、局部变量等 ✓ 正确答案
C 参数一律通过寄存器传递,与调用约定无关
D 栈帧一旦分配,大小固定不可变
#

13. 线程栈与主线程栈的差异,pthread_create 默认栈大小、栈向下增长与 guard page,为什么线程栈不能无限增长?

A 线程栈由 mmap 分配,默认约 8MB,固定大小且带 guard page,不能无限增长 ✓ 正确答案
B 线程栈与主线程栈一样可以动态无限扩展
C 线程栈没有大小限制
D 线程栈向上增长,与主线程栈相同
#

14. Stack Clash 攻击的原理,栈向堆或其他映射区增长时为何能绕过 guard page,Linux 的 stack guard gap 如何防御?

A Stack Clash 只在栈满时触发,无法绕过 guard page
B Stack Clash 与栈溢出无关
C guard page 永远不会被占用
D 攻击利用栈增长越过被映射覆盖的 guard page 进入相邻区域;Linux 用 stack guard gap 拉开距离防御 ✓ 正确答案
#

15. 为何 C++ 静态对象初始化在 .data 而 .bss 仅 POD?

A 所有 C++ 静态对象都放在 .bss
B 非 POD 静态对象也仅在加载时清零即可
C .bss 只存放零初始化且无需构造的 POD,非 POD 静态对象需运行时构造 ✓ 正确答案
D .bss 段存放构造函数代码
#

16. 栈的增长方向与栈溢出,为什么栈向下增长而堆向上?

A 主流 x86 中栈向下增长、堆向上增长 ✓ 正确答案
B 栈向上增长、堆向下增长
C 两者都向下增长
D 栈与堆增长方向与架构无关
#

17. 栈溢出与堆溢出的区别与防护?

A 两者都只影响返回地址
B 栈溢出覆盖返回地址,堆溢出覆盖相邻堆块元数据/数据 ✓ 正确答案
C 堆溢出只发生在栈上
D 栈溢出与堆溢出无法防御
#

18. 内存映射(mmap)与文件 IO 的对比?

A mmap 每次访问都触发系统调用,比 read 慢
B mmap 通过虚拟内存映射文件,减少用户内核拷贝,适合大文件随机访问 ✓ 正确答案
C read/write 会将数据直接映射到用户进程
D mmap 无法共享文件