--- linux-2.6.35-rc4/arch/frv/kernel/vmlinux.lds.S +++ linux-2.6.35-rc4-fs-kernel-linker-scripts/arch/frv/kernel/vmlinux.lds.S @@ -114,7 +114,6 @@ .sbss : { *(.sbss .sbss.*) } .bss : { *(.bss .bss.*) } - .bss..stack : { *(.bss) } __bss_stop = .; _end = . ; --- linux-2.6.35-rc4/arch/ia64/scripts/check-segrel.lds +++ linux-2.6.35-rc4-fs-kernel-linker-scripts/arch/ia64/scripts/check-segrel.lds @@ -1,9 +1,9 @@ SECTIONS { . = SIZEOF_HEADERS; - .rodata : { *(.rodata) } :ro + .rodata : { *(.rodata) *(.rodata.*) } :ro .note : { *(.note*) } . = 0xa0000; - .data : { *(.data) } :dat + .data : { *(.data) *(.data.*) } :dat /DISCARD/ : { *(*) } } PHDRS { --- linux-2.6.35-rc4/arch/m68knommu/kernel/vmlinux.lds.S +++ linux-2.6.35-rc4-fs-kernel-linker-scripts/arch/m68knommu/kernel/vmlinux.lds.S @@ -169,6 +169,7 @@ . = ALIGN(4); _sbss = . ; *(.bss) + *(.bss.*) *(COMMON) . = ALIGN(4) ; _ebss = . ; --- linux-2.6.35-rc4/arch/mips/lasat/image/romscript.normal +++ linux-2.6.35-rc4-fs-kernel-linker-scripts/arch/mips/lasat/image/romscript.normal @@ -12,6 +12,7 @@ .data ALIGN(0x10) : { *(.data) + *(.data.*) } _image_start = ADDR(.data); _image_size = SIZEOF(.data); --- linux-2.6.35-rc4/arch/parisc/kernel/vmlinux.lds.S +++ linux-2.6.35-rc4-fs-kernel-linker-scripts/arch/parisc/kernel/vmlinux.lds.S @@ -112,6 +112,7 @@ } .bss : { *(.bss) + *(.bss.*) *(COMMON) } __bss_stop = .; --- linux-2.6.35-rc4/arch/sh/kernel/vsyscall/vsyscall.lds.S +++ linux-2.6.35-rc4-fs-kernel-linker-scripts/arch/sh/kernel/vsyscall/vsyscall.lds.S @@ -35,7 +35,7 @@ */ . = 0x400; - .text : { *(.text) } :text =0x90909090 + .text : { *(.text) *(.text.*) } :text =0x90909090 .note : { *(.note.*) } :text :note .eh_frame_hdr : { *(.eh_frame_hdr ) } :text :eh_frame_hdr .eh_frame : { --- linux-2.6.35-rc4/arch/x86/kernel/acpi/realmode/wakeup.lds.S +++ linux-2.6.35-rc4-fs-kernel-linker-scripts/arch/x86/kernel/acpi/realmode/wakeup.lds.S @@ -42,6 +42,7 @@ .bss : { __bss_start = .; *(.bss) + *(.bss.*) __bss_end = .; } --- linux-2.6.35-rc4/arch/x86/kernel/vmlinux.lds.S +++ linux-2.6.35-rc4-fs-kernel-linker-scripts/arch/x86/kernel/vmlinux.lds.S @@ -307,6 +307,7 @@ __bss_start = .; *(.bss..page_aligned) *(.bss) + *(.bss.*) . = ALIGN(4); __bss_stop = .; } --- linux-2.6.35-rc4/include/asm-generic/vmlinux.lds.h +++ linux-2.6.35-rc4-fs-kernel-linker-scripts/include/asm-generic/vmlinux.lds.h @@ -140,9 +140,22 @@ #define TRACE_SYSCALLS() #endif +/* .data.foo are generated by gcc itself with -fdata-sections, + * whereas double-dot sections (like .data..percpu) are generated + * by kernel's magic macros. + * + * arch/.../vmlinux.lds.S decides where to place various double-dot sections + * as needed by its arch, here DATA_DATA needs to be careful and collect + * only .data and .data.foo sections, skipping .data..foo + * + * Same goes for .text, .bss and .rodata. In case of .rodata, various + * .rodata.foo sections are generated by gcc even without -fdata-sections + */ + /* .data section */ #define DATA_DATA \ *(.data) \ + *(.data.[A-Za-z0-9_$^]*) \ *(.ref.data) \ DEV_KEEP(init.data) \ DEV_KEEP(exit.data) \ @@ -202,7 +215,8 @@ . = ALIGN((align)); \ .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ VMLINUX_SYMBOL(__start_rodata) = .; \ - *(.rodata) *(.rodata.*) \ + *(.rodata) \ + *(.rodata.[A-Za-z0-9_$^]*) \ *(__vermagic) /* Kernel version magic */ \ *(__markers_strings) /* Markers: strings */ \ *(__tracepoints_strings)/* Tracepoints: strings */ \ @@ -369,6 +383,7 @@ ALIGN_FUNCTION(); \ *(.text.hot) \ *(.text) \ + *(.text.[A-Za-z0-9_$^]*) \ *(.ref.text) \ DEV_KEEP(init.text) \ DEV_KEEP(exit.text) \ @@ -502,6 +517,7 @@ *(.bss..page_aligned) \ *(.dynbss) \ *(.bss) \ + *(.bss.[A-Za-z0-9_$^]*) \ *(COMMON) \ }