__attribute__((__section__(...))) 增加的section会体现在vmlinux.lds中

📅 发布时间:2026/8/5 12:22:10
__attribute__((__section__(...))) 增加的section会体现在vmlinux.lds中 __attribute__((__section__(...)))定义的节section最终必须在链接脚本vmlinux.lds或其通用定义文件vmlinux.lds.h中有对应的处理否则会成为“孤儿节”orphan section引发编译警告甚至错误。编译与链接流程简述首先明确一个基本流程.c或.S文件经过预处理、编译后生成.o目标文件。在这个过程中__attribute__((__section__(.mysection)))会指示编译器将特定变量或函数放入名为.mysection的节中。随后链接器ld会根据vmlinux.lds这个链接脚本来决定如何将所有.o文件中的节最终组装成一个完整的vmlinux内核映像。在vmlinux.lds中的处理方式vmlinux.lds并非一个静态文件它通常由vmlinux.lds.S预处理生成。为了让链接脚本具备可维护性内核开发者将许多通用规则提炼到了include/asm-generic/vmlinux.lds.h中。因此__section__定义的节其归宿可以归纳为以下几种被通用宏显式包含这是最规范、最常见的情况。例如Per-CPU 变量使用的.data..percpu节就是通过vmlinux.lds.h中定义的PERCPU_SECTION等宏被显式地放在输出文件的.data..percpu输出节中的。架构专用脚本直接处理某些架构如 Hexagon有特殊的属性节如.hexagon.attributes它们会被直接添加到对应架构的vmlinux.lds.S文件中进行明确处理以避免成为孤儿节。未被处理沦为“孤儿节”如果链接脚本中没有规则匹配一个输入节它就会成为孤儿节。链接器会按默认规则将其放置并可能产生警告。一个典型的例子是当CONFIG_SMPn时由DEFINE_PER_CPU_DECRYPTED宏创建的.data..decrypted节因未在链接脚本中找到匹配项而产生过孤儿节警告。该问题最终通过在PERCPU_DECRYPTED_SECTION中显式添加*(.data..decrypted)得以解决。这反过来也印证了每个通过__section__自定义的节都必须有对应的链接脚本规则这是构建成功的前提。总结简而言之__attribute__((__section__(...)))是在目标文件.o中创建了一个新的“标签”而vmlinux.lds及其包含的vmlinux.lds.h则定义了这些标签如何被最终整理和编排。两者必须协同工作缺一不可。