* [PATCH 1/2] section garbage collection for i386
@ 2007-09-12 20:24 Denys Vlasenko
2007-09-12 20:30 ` [PATCH 2/2] " Denys Vlasenko
0 siblings, 1 reply; 3+ messages in thread
From: Denys Vlasenko @ 2007-09-12 20:24 UTC (permalink / raw)
To: Sam Ravnborg; +Cc: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 325 bytes --]
Hi Sam,
This patch is preparatory: it adds a few KEEP() directives where
I forgot them in previous patch set, adds comments which explains
places where KEEP() is definitely not needed, and fixes i386 vdso generation
in an "obviously safe" way.
Please apply.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
--
vda
[-- Attachment #2: linux-2.6.23-rc4.5.fixes.patch --]
[-- Type: text/x-diff, Size: 2329 bytes --]
diff -urpN linux-2.6.23-rc4.gc4/arch/i386/kernel/vsyscall.lds.S linux-2.6.23-rc4.gc5/arch/i386/kernel/vsyscall.lds.S
--- linux-2.6.23-rc4.gc4/arch/i386/kernel/vsyscall.lds.S 2007-07-09 00:32:17.000000000 +0100
+++ linux-2.6.23-rc4.gc5/arch/i386/kernel/vsyscall.lds.S 2007-09-12 19:47:17.000000000 +0100
@@ -23,10 +23,10 @@ SECTIONS
is insufficient, ld -shared will barf. Just increase it here. */
. = VDSO_PRELINK_asm + 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 : { KEEP (*(.eh_frame)) } :text
+ .eh_frame : { KEEP(*(.eh_frame)) } :text
.dynamic : { *(.dynamic) } :text :dynamic
.useless : {
*(.got.plt) *(.got)
diff -urpN linux-2.6.23-rc4.gc4/include/asm-generic/vmlinux.lds.h linux-2.6.23-rc4.gc5/include/asm-generic/vmlinux.lds.h
--- linux-2.6.23-rc4.gc4/include/asm-generic/vmlinux.lds.h 2007-09-12 19:46:32.000000000 +0100
+++ linux-2.6.23-rc4.gc5/include/asm-generic/vmlinux.lds.h 2007-09-12 19:47:17.000000000 +0100
@@ -169,6 +169,7 @@
#define SCHED_TEXT \
ALIGN_FUNCTION(); \
VMLINUX_SYMBOL(__sched_text_start) = .; \
+ /* No need to KEEP */ \
*(.sched.text) \
VMLINUX_SYMBOL(__sched_text_end) = .;
@@ -177,12 +178,14 @@
#define LOCK_TEXT \
ALIGN_FUNCTION(); \
VMLINUX_SYMBOL(__lock_text_start) = .; \
+ /* No need to KEEP */ \
*(.spinlock.text) \
VMLINUX_SYMBOL(__lock_text_end) = .;
#define KPROBES_TEXT \
ALIGN_FUNCTION(); \
VMLINUX_SYMBOL(__kprobes_text_start) = .; \
+ /* No need to KEEP */ \
*(.kprobes.text) \
VMLINUX_SYMBOL(__kprobes_text_end) = .;
@@ -228,14 +231,16 @@
. = ALIGN(8); \
__bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \
__start___bug_table = .; \
- *(__bug_table) \
+ /* Support for BUG() */ \
+ KEEP(*(__bug_table)) \
__stop___bug_table = .; \
}
#define NOTES \
.notes : AT(ADDR(.notes) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start_notes) = .; \
- *(.note.*) \
+ /* For /sys/kernel/notes */ \
+ KEEP(*(.note.*)) \
VMLINUX_SYMBOL(__stop_notes) = .; \
}
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] section garbage collection for i386
2007-09-12 20:24 [PATCH 1/2] section garbage collection for i386 Denys Vlasenko
@ 2007-09-12 20:30 ` Denys Vlasenko
2007-09-12 20:45 ` [PATCH 3/2] section garbage collection for i386 - BONUS TRACK Denys Vlasenko
0 siblings, 1 reply; 3+ messages in thread
From: Denys Vlasenko @ 2007-09-12 20:30 UTC (permalink / raw)
To: Sam Ravnborg; +Cc: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 1658 bytes --]
Hi Sam,
This patch adds module linker script (completely analogous to x86_64),
and "minimally" fixes vmlinux linker script by adding KEEPs.
It also deleted an outdated comment and amends help text.
I got a few "section mismatch" warnings with .config which doesn't
show them (IIRC) on original kernel.
I took a look and I think that original kernel was actually in error
and these warnings are correct!
WARNING: vmlinux.o(.text.kmem_cache_create+0x32f): Section mismatch: reference to .init.refok.text:setup_cpu_cache (after 'kmem_cache_create')
WARNING: vmlinux.o(.text.vgacon_startup+0x2dd): Section mismatch: reference to .init.refok.text:vgacon_scrollback_startup (after 'vgacon_startup')
WARNING: vmlinux.o(.data.smp_ops+0x0): Section mismatch: reference to .init.text:native_smp_prepare_boot_cpu (after 'smp_ops')
WARNING: vmlinux.o(.data.smp_ops+0x4): Section mismatch: reference to .init.text:native_smp_prepare_cpus (after 'smp_ops')
WARNING: vmlinux.o(.data.smp_ops+0xc): Section mismatch: reference to .init.text:native_smp_cpus_done (after 'smp_ops')
WARNING: vmlinux.o(.data.vesafb_driver+0x0): Section mismatch: reference to .init.text:vesafb_probe (after 'vesafb_driver')
WARNING: vmlinux.o(.data.serial8250_console+0x20): Section mismatch: reference to .init.text:serial8250_console_setup (after 'serial8250_console')
WARNING: vmlinux.o(.data.dgrs_pci_driver+0x10): Section mismatch: reference to .init.text:dgrs_pci_probe (after 'dgrs_pci_driver')
Risk of this patch is analogous to last patch of first series -
run-tested and looks safe, but needs to go into -mm first.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
--
vda
[-- Attachment #2: linux-2.6.23-rc4.6.i386.patch --]
[-- Type: text/x-diff, Size: 9551 bytes --]
diff -urpN linux-2.6.23-rc4.gc5/arch/i386/kernel/modules.lds linux-2.6.23-rc4.gc6/arch/i386/kernel/modules.lds
--- linux-2.6.23-rc4.gc5/arch/i386/kernel/modules.lds 1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.23-rc4.gc6/arch/i386/kernel/modules.lds 2007-09-12 19:49:10.000000000 +0100
@@ -0,0 +1,123 @@
+OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
+OUTPUT_ARCH(i386)
+
+/*
+This linker script is used if CONFIG_DISCARD_UNUSED_SECTIONS=y.
+We are trying to minimize number of sections in .ko file
+by coalescing .text.x, rodata.x, .data.x and bss.x input
+sections into one output section.
+
+This script may be usable without CONFIG_DISCARD_UNUSED_SECTIONS too.
+
+Kernel module loader (kernel/module.c) needs to see the following sections:
+
+.init*
+.exit*
+.gnu.linkonce.this_module
+.percpu.data
+.modinfo
+__ksymtab_gpl_future
+__ksymtab_gpl
+__ksymtab_unused_gpl
+__ksymtab_unused
+__ksymtab
+__kcrctab_gpl_future
+__kcrctab_gpl
+__kcrctab_unused_gpl
+__kcrctab_unused
+__kcrctab
+__param
+__ex_table
+__obsparm
+__versions
+.debug (?!)
+$ARCH_UNWIND_SECTION_NAME
+
+They must not be coalesced into sections with other names.
+
+*/
+
+SECTIONS
+{
+ /* ro, code */
+
+ /* .fixup and .altinstr_replacement work just fine
+ * without dedicated sections */
+ .text : {
+ *(SORT_BY_ALIGNMENT(.text*))
+ /* __ex_table points here */
+ *(SORT_BY_ALIGNMENT(.fixup*))
+ /* .altinstructions points here */
+ *(SORT_BY_ALIGNMENT(.altinstr_replacement*))
+ }
+ /* only if CONFIG_MODULE_UNLOAD */
+ .exit.text : { *(SORT_BY_ALIGNMENT(.exit.text)) }
+ /* end CONFIG_MODULE_UNLOAD */
+
+ /* ro, data */
+
+ .rodata : { *(SORT_BY_ALIGNMENT(.rodata*)) }
+ /* Kernel searches through this table when it needs to handle an exception */
+ __ex_table : { *(__ex_table*) }
+ /* These two tables are not currently handled by in-kernel module loader,
+ * but likely will be in future kernels */
+ .altinstructions : { *(.altinstructions*) }
+ .smp_locks : { *(.smp_locks*) }
+ /* Used by depmod in order to generate modules.dep, modules.symbols */
+ __ksymtab_strings : { *(SORT_BY_ALIGNMENT(__ksymtab_strings)) }
+ /* EXPORT_SYMBOLs exported in this module */
+ __ksymtab_gpl_future : { *(__ksymtab_gpl_future) }
+ __ksymtab_gpl : { *(__ksymtab_gpl) }
+ __ksymtab_unused_gpl : { *(__ksymtab_unused_gpl) }
+ __ksymtab_unused : { *(__ksymtab_unused) }
+ __ksymtab : { *(__ksymtab) }
+ /* only if CONFIG_MODVERSIONS */
+ __kcrctab_gpl_future : { *(__kcrctab_gpl_future) }
+ __kcrctab_gpl : { *(__kcrctab_gpl) }
+ __kcrctab_unused_gpl : { *(__kcrctab_unused_gpl) }
+ __kcrctab_unused : { *(__kcrctab_unused) }
+ __kcrctab : { *(__kcrctab) }
+ /* from *.mod.c: const struct modversion_info ____versions[] */
+ __versions : { *(__versions) }
+ /* end CONFIG_MODVERSIONS */
+ __param : { *(.__param) }
+ __obsparm : { *(.__obsparm) }
+ /* from *.mod.c: const char __module_depends[] "depends=mod1,mod2" */
+ .modinfo : { *(SORT_BY_ALIGNMENT(.modinfo)) }
+ /* ld segfaults if we give it --build-id and then discard this section */
+ .note.gnu.build-id : { *(.note.gnu.build-id) }
+
+ /* rw, data */
+
+ .data : {
+ *(SORT_BY_ALIGNMENT(.cacheline_aligned.data))
+ *(SORT_BY_ALIGNMENT(.data*))
+ *(SORT_BY_ALIGNMENT(.read_mostly.data))
+ }
+ /* from *.mod.c: struct module __this_module */
+ .gnu.linkonce.this_module : { *(.gnu.linkonce.this_module) }
+ /* only if CONFIG_SMP */
+ .percpu.data : { *(SORT_BY_ALIGNMENT(.percpu.data)) }
+ /* end CONFIG_SMP */
+ /* only if CONFIG_MODULE_UNLOAD */
+ .exit.data : { *(SORT_BY_ALIGNMENT(.exit.data)) }
+ /* end CONFIG_MODULE_UNLOAD */
+
+ /* rw, data initialized to 0 */
+
+ .bss : { *(SORT_BY_ALIGNMENT(.bss*)) }
+
+ /* init code/data. discarded at the end of sys_init_module() */
+
+ .init.text : { *(SORT_BY_ALIGNMENT(.init.text)) }
+ .init.data : { *(SORT_BY_ALIGNMENT(.init.data)) }
+
+ /* Be bold and resist the temptation to pull junk "by default" */
+
+ /DISCARD/ : { *(*) }
+
+ /* If you are going to revive these, please add comment why it is needed */
+ /* .debug : { *(.debug) } */
+ /* .comment : { *(.comment) } */
+ /* .note.GNU-stack : { *(.note.GNU-stack) } */
+}
diff -urpN linux-2.6.23-rc4.gc5/arch/i386/kernel/vmlinux.lds.S linux-2.6.23-rc4.gc6/arch/i386/kernel/vmlinux.lds.S
--- linux-2.6.23-rc4.gc5/arch/i386/kernel/vmlinux.lds.S 2007-09-12 19:46:32.000000000 +0100
+++ linux-2.6.23-rc4.gc6/arch/i386/kernel/vmlinux.lds.S 2007-09-12 19:51:42.000000000 +0100
@@ -32,7 +32,7 @@ SECTIONS
.head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {
_text = .; /* Text and read-only data */
- *(.head.text)
+ KEEP(*(.head.text))
} :text = 0x9090
/* read-only */
@@ -41,6 +41,7 @@ SECTIONS
SCHED_TEXT
LOCK_TEXT
KPROBES_TEXT
+ /* No need to KEEP - referenced by __ex_table */
*(.fixup)
*(.gnu.warning)
_etext = .; /* End of text section */
@@ -49,7 +50,7 @@ SECTIONS
. = ALIGN(16); /* Exception table */
__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
__start___ex_table = .;
- *(__ex_table)
+ KEEP(*(__ex_table))
__stop___ex_table = .;
}
@@ -60,7 +61,8 @@ SECTIONS
. = ALIGN(4);
.tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {
__tracedata_start = .;
- *(.tracedata)
+ /* Resume debug tracing */
+ KEEP(*(.tracedata))
__tracedata_end = .;
}
@@ -71,11 +73,12 @@ SECTIONS
.data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */
DATA_DATA
CONSTRUCTORS
- } :data
+ } :data
. = ALIGN(4096);
.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
__nosave_begin = .;
+ /* No need to KEEP */
*(.nosave.data)
. = ALIGN(4096);
__nosave_end = .;
@@ -108,19 +111,13 @@ SECTIONS
. = ALIGN(4096);
.smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
__smp_locks = .;
- *(.smp_locks)
+ KEEP(*(.smp_locks))
__smp_locks_end = .;
}
- /* will be freed after init
- * Following ALIGN() is required to make sure no other data falls on the
- * same page where __smp_alt_end is pointing as that page might be freed
- * after boot. Always make sure that ALIGN() directive is present after
- * the section which contains __smp_alt_end.
- */
- . = ALIGN(4096);
- /* will be freed after init */
- . = ALIGN(4096); /* Init code and data */
+ /* Will be freed after init */
+ /* Init code and data */
+ . = ALIGN(4096);
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
__init_begin = .;
_sinittext = .;
@@ -131,7 +128,9 @@ SECTIONS
. = ALIGN(16);
.init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
__setup_start = .;
- *(.init.setup)
+ /* __setup_param() macro produces these,
+ * obsolete_checksetup() processes them */
+ KEEP(*(.init.setup))
__setup_end = .;
}
.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
@@ -141,46 +140,50 @@ SECTIONS
}
.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
__con_initcall_start = .;
- *(.con_initcall.init)
+ KEEP(*(.con_initcall.init))
__con_initcall_end = .;
}
SECURITY_INIT
. = ALIGN(4);
.altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {
__alt_instructions = .;
- *(.altinstructions)
+ KEEP(*(.altinstructions))
__alt_instructions_end = .;
}
.altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {
+ /* No need to KEEP - referenced by .altinstructions */
*(.altinstr_replacement)
}
. = ALIGN(4);
.parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) {
__parainstructions = .;
- *(.parainstructions)
+ KEEP(*(.parainstructions))
__parainstructions_end = .;
}
- /* .exit.text is discard at runtime, not link time, to deal with references
+ /* .exit.text is discarded at runtime, not link time, to deal with references
from .altinstructions and .eh_frame */
.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { *(.exit.text) }
.exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { *(.exit.data) }
+
#if defined(CONFIG_BLK_DEV_INITRD)
. = ALIGN(4096);
.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
__initramfs_start = .;
- *(.init.ramfs)
+ KEEP(*(.init.ramfs))
__initramfs_end = .;
}
#endif
+
. = ALIGN(4096);
- .percpu.data : AT(ADDR(.percpu.data) - LOAD_OFFSET) {
+ .percpu.data : AT(ADDR(.percpu.data) - LOAD_OFFSET) {
__per_cpu_start = .;
*(.percpu.data)
*(.percpu.shared_aligned.data)
__per_cpu_end = .;
}
. = ALIGN(4096);
- /* freed after init ends here */
+
+ /* End of "freed after init" portion */
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
__init_end = .;
@@ -189,7 +192,7 @@ SECTIONS
* we want to combine into bss, otherwise gcc does not set
* 'nobits' flag for the section, and it cannot be merged into bss. */
*(.bss.k.page_aligned)
- *(.bss)
+ *(SORT_BY_ALIGNMENT(.bss*))
. = ALIGN(4);
__bss_stop = .;
_end = . ;
@@ -201,7 +204,7 @@ SECTIONS
/* Sections to be discarded */
/DISCARD/ : {
*(.exitcall.exit)
- }
+ }
STABS_DEBUG
diff -urpN linux-2.6.23-rc4.gc5/init/Kconfig linux-2.6.23-rc4.gc6/init/Kconfig
--- linux-2.6.23-rc4.gc5/init/Kconfig 2007-09-12 19:46:32.000000000 +0100
+++ linux-2.6.23-rc4.gc6/init/Kconfig 2007-09-12 21:23:39.000000000 +0100
@@ -360,7 +360,7 @@ config DISCARD_UNUSED_SECTIONS
and even then surprises are likely.
This option also requires architecture-specific changes.
- Currently working architectures: x86_64
+ Currently working architectures: x86_64, i386
If unsure, say N.
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 3/2] section garbage collection for i386 - BONUS TRACK
2007-09-12 20:30 ` [PATCH 2/2] " Denys Vlasenko
@ 2007-09-12 20:45 ` Denys Vlasenko
0 siblings, 0 replies; 3+ messages in thread
From: Denys Vlasenko @ 2007-09-12 20:45 UTC (permalink / raw)
To: Sam Ravnborg; +Cc: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 8595 bytes --]
Hi Sam,
This patch makes i386 vmlinux linker script simpler
by minimizing number of generated sections.
For example, these sections:
21 .init.text 000204a0 78701000 00701000 00502000 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
22 .init.data 000268db 787214a0 007214a0 005224a0 2**3
CONTENTS, ALLOC, LOAD, DATA
23 .init.setup 00000654 78747d80 00747d80 00548d80 2**2
CONTENTS, ALLOC, LOAD, DATA
24 .initcall.init 000004c4 787483d4 007483d4 005493d4 2**2
CONTENTS, ALLOC, LOAD, DATA
25 .con_initcall.init 00000008 78748898 00748898 00549898 2**2
CONTENTS, ALLOC, LOAD, DATA
26 .altinstructions 00009c23 787488a0 007488a0 005498a0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
27 .altinstr_replacement 000027de 787524c3 007524c3 005534c3 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
28 .exit.text 00000f31 78754ca4 00754ca4 00555ca4 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
29 .init.ramfs 00000086 78756000 00756000 00557000 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
code, data, data, data, rodata, code, code, data... -
doesn't look clean.
Can more sanely be grouped like this:
15 .init.text 00023baf 78701000 00701000 00502000 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
16 .init.rodata 00009ca8 78725000 00725000 00526000 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .init.data 00027408 7872eca8 0072eca8 0052fca8 2**3
CONTENTS, ALLOC, LOAD, DATA
All in all, we have 20 sections instead of 32, and it still boots okay.
Full listing:
Before:
$ objdump -h
linux-2.6.23-rc4.gc6.t/vmlinux: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .head.text 00000379 78200000 00200000 00001000 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .text 003646da 78200380 00200380 00001380 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 __ex_table 00000ee8 78564a60 00564a60 00365a60 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .notes 00000024 78565948 00565948 00366948 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
4 .rodata 000e85fe 78566000 00566000 00367000 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .pci_fixup 00000700 7864e600 0064e600 0044f600 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 __ksymtab 000057a0 7864ed00 0064ed00 0044fd00 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 __ksymtab_gpl 00001ac0 786544a0 006544a0 004554a0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 __ksymtab_gpl_future 00000018 78655f60 00655f60 00456f60 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 __kcrctab 00002bd0 78655f78 00655f78 00456f78 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 __kcrctab_gpl 00000d60 78658b48 00658b48 00459b48 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 __kcrctab_gpl_future 0000000c 786598a8 006598a8 0045a8a8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
12 __ksymtab_strings 00010d8b 786598b4 006598b4 0045a8b4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
13 __param 00001838 7866a640 0066a640 0046b640 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .data 0007fe99 7866c000 0066c000 0046d000 2**7
CONTENTS, ALLOC, LOAD, DATA
15 .data_nosave 00001000 786ec000 006ec000 004ed000 2**12
CONTENTS, ALLOC, LOAD, DATA
16 .page_aligned.data 00000800 786ed000 006ed000 004ee000 2**2
CONTENTS, ALLOC, LOAD, DATA
17 .cacheline_aligned.data 0000a000 786ed800 006ed800 004ee800 2**7
CONTENTS, ALLOC, LOAD, DATA
18 .read_mostly.data 000020d0 786f7800 006f7800 004f8800 2**7
CONTENTS, ALLOC, LOAD, DATA
19 .init_task.data 00002000 786fa000 006fa000 004fb000 2**2
CONTENTS, ALLOC, LOAD, DATA
20 .smp_locks 00004798 786fc000 006fc000 004fd000 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
21 .init.text 000204a0 78701000 00701000 00502000 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
22 .init.data 000268db 787214a0 007214a0 005224a0 2**3
CONTENTS, ALLOC, LOAD, DATA
23 .init.setup 00000654 78747d80 00747d80 00548d80 2**2
CONTENTS, ALLOC, LOAD, DATA
24 .initcall.init 000004c4 787483d4 007483d4 005493d4 2**2
CONTENTS, ALLOC, LOAD, DATA
25 .con_initcall.init 00000008 78748898 00748898 00549898 2**2
CONTENTS, ALLOC, LOAD, DATA
26 .altinstructions 00009c23 787488a0 007488a0 005498a0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
27 .altinstr_replacement 000027de 787524c3 007524c3 005534c3 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
28 .exit.text 00000f31 78754ca4 00754ca4 00555ca4 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
29 .init.ramfs 00000086 78756000 00756000 00557000 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
30 .percpu.data 00005f38 78757000 00757000 00558000 2**12
CONTENTS, ALLOC, LOAD, DATA
31 .bss 00047000 7875d000 0075d000 0055df38 2**12
ALLOC
32 .comment 00005004 00000000 00000000 0055df38 2**0
CONTENTS, READONLY
After:
linux-2.6.23-rc4.gc7.t/vmlinux: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00364a5a 78200000 00200000 00001000 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 __ex_table 00000ee8 78564a60 00564a60 00365a60 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .notes 00000024 78565948 00565948 00366948 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
3 .rodata 000e8602 78566000 00566000 00367000 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .pci_fixup 00000700 7864e604 0064e604 0044f604 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 __ksymtab 000057a0 7864ed04 0064ed04 0044fd04 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 __ksymtab_gpl 00001ac0 786544a4 006544a4 004554a4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 __ksymtab_gpl_future 00000018 78655f64 00655f64 00456f64 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 __kcrctab 00002bd0 78655f7c 00655f7c 00456f7c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 __kcrctab_gpl 00000d60 78658b4c 00658b4c 00459b4c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 __kcrctab_gpl_future 0000000c 786598ac 006598ac 0045a8ac 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 __ksymtab_strings 00010d8b 786598b8 006598b8 0045a8b8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
12 __param 00001838 7866a644 0066a644 0046b644 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
13 .data 0008f7d0 7866c000 0066c000 0046d000 2**12
CONTENTS, ALLOC, LOAD, DATA
14 .smp_locks 00004798 786fc000 006fc000 004fd000 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
15 .init.text 00023baf 78701000 00701000 00502000 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
16 .init.rodata 00009ca8 78725000 00725000 00526000 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .init.data 00027408 7872eca8 0072eca8 0052fca8 2**3
CONTENTS, ALLOC, LOAD, DATA
18 .percpu.data 00005f38 78757000 00757000 00558000 2**12
CONTENTS, ALLOC, LOAD, DATA
19 .bss 00047000 7875d000 0075d000 0055df38 2**12
ALLOC
20 .comment 00005004 00000000 00000000 0055df38 2**0
CONTENTS, READONLY
Patch is run-tested.
It's purely cleanup work, it's not bringing any noticeable
size wins (well, maybe statistically it will have a bit less
alignment padding because I placed together a few page-aligned
chunks, but that's all).
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
--
vda
[-- Attachment #2: linux-2.6.23-rc4.7.i386part2.patch --]
[-- Type: text/x-diff, Size: 6591 bytes --]
diff -urpN linux-2.6.23-rc4.gc6/arch/i386/kernel/vmlinux.lds.S linux-2.6.23-rc4.gc7/arch/i386/kernel/vmlinux.lds.S
--- linux-2.6.23-rc4.gc6/arch/i386/kernel/vmlinux.lds.S 2007-09-12 19:51:42.000000000 +0100
+++ linux-2.6.23-rc4.gc7/arch/i386/kernel/vmlinux.lds.S 2007-09-12 21:10:38.000000000 +0100
@@ -6,7 +6,19 @@
* at run time. Absolute symbols are not relocated. If symbol value should
* change if kernel is relocated, make the symbol section relative
* by putting it inside the section definition.
+ *
+ * Try to avoid creating output sections needlessly.
+ * Group pieces with same attributes (ro/rw, code/data,
+ * persistent/discarded-after-init) together in one section.
+ *
+ * Statistically, padding is smaller if input sections
+ * within output section are sorted by alignment in descending order.
+ *
+ * If you need to ALIGN a section, putting ALIGN immediately before section
+ * can result in smaller on-disk image than when you put it immeadiately
+ * after section's opening '{'.
*/
+
#define LOAD_OFFSET __PAGE_OFFSET
#include <asm-generic/vmlinux.lds.h>
@@ -18,6 +30,7 @@
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(phys_startup_32)
+
jiffies = jiffies_64;
PHDRS {
@@ -30,13 +43,11 @@ SECTIONS
. = LOAD_OFFSET + LOAD_PHYSICAL_ADDR;
phys_startup_32 = startup_32 - LOAD_OFFSET;
- .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {
- _text = .; /* Text and read-only data */
- KEEP(*(.head.text))
- } :text = 0x9090
-
/* read-only */
.text : AT(ADDR(.text) - LOAD_OFFSET) {
+ _text = .; /* Text and read-only data */
+ KEEP(*(.head.text))
+
TEXT_TEXT
SCHED_TEXT
LOCK_TEXT
@@ -54,6 +65,7 @@ SECTIONS
__stop___ex_table = .;
}
+ /* Hm? NOTES end up marked as CODE in vmlinux, but they are not. FIXME */
NOTES :text :note
BUG_TABLE :text
@@ -69,45 +81,39 @@ SECTIONS
RODATA
/* writeable */
- . = ALIGN(4096);
+ . = ALIGN(THREAD_SIZE); /* at least 4k */
.data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */
- DATA_DATA
- CONSTRUCTORS
- } :data
+ /* init_task */
+ *(.init_task.data)
- . = ALIGN(4096);
- .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
+ . = ALIGN(4096);
+ *(.page_aligned.data)
+
+ . = ALIGN(4096);
__nosave_begin = .;
/* No need to KEEP */
*(.nosave.data)
. = ALIGN(4096);
__nosave_end = .;
- }
- . = ALIGN(4096);
- .page_aligned.data : AT(ADDR(.page_aligned.data) - LOAD_OFFSET) {
- *(.page_aligned.data)
+ /* The IDT has to be page-aligned because of F0 0F bug */
*(.idt.data)
- }
- . = ALIGN(32);
- .cacheline_aligned.data : AT(ADDR(.cacheline_aligned.data) - LOAD_OFFSET) {
+ DATA_DATA
+ CONSTRUCTORS
+
+ . = ALIGN(32);
*(.cacheline_aligned.data)
- }
- /* rarely changed data like cpu maps */
- . = ALIGN(32);
- .read_mostly.data : AT(ADDR(.read_mostly.data) - LOAD_OFFSET) {
+ /* rarely changed data like cpu maps */
+ . = ALIGN(32);
*(.read_mostly.data)
- _edata = .; /* End of data section */
- }
- . = ALIGN(THREAD_SIZE); /* init_task */
- .init_task.data : AT(ADDR(.init_task.data) - LOAD_OFFSET) {
- *(.init_task.data)
- }
+ _edata = .;
+ } :data
+
+ /* Might get freed after init */
- /* might get freed after init */
. = ALIGN(4096);
.smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
__smp_locks = .;
@@ -116,75 +122,80 @@ SECTIONS
}
/* Will be freed after init */
- /* Init code and data */
+
. = ALIGN(4096);
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
__init_begin = .;
_sinittext = .;
*(.init.text)
_einittext = .;
+
+ /* No need to KEEP - referenced by .altinstructions */
+ *(.altinstr_replacement)
+
+ /* .exit.text is discarded at runtime, not link time, to deal with references
+ from .altinstructions and .eh_frame */
+ *(.exit.text)
+ }
+
+ /* ro, code */
+ SECURITY_INIT
+
+#if defined(CONFIG_BLK_DEV_INITRD)
+ /* ALIGN outside section may make on-disk image smaller */
+ . = ALIGN(4096);
+#endif
+ .init.rodata : AT(ADDR(.init.rodata) - LOAD_OFFSET) {
+#if defined(CONFIG_BLK_DEV_INITRD)
+ __initramfs_start = .;
+ KEEP(*(.init.ramfs))
+ __initramfs_end = .;
+#endif
+ . = ALIGN(4);
+ __alt_instructions = .;
+ KEEP(*(.altinstructions))
+ __alt_instructions_end = .;
+
+ . = ALIGN(4);
+ __parainstructions = .;
+ KEEP(*(.parainstructions))
+ __parainstructions_end = .;
}
- .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) }
- . = ALIGN(16);
- .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
+
+ .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
+ *(.init.data)
+
+ . = ALIGN(16);
__setup_start = .;
/* __setup_param() macro produces these,
* obsolete_checksetup() processes them */
KEEP(*(.init.setup))
__setup_end = .;
- }
- .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
+
__initcall_start = .;
INITCALLS
__initcall_end = .;
- }
- .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
+
__con_initcall_start = .;
KEEP(*(.con_initcall.init))
__con_initcall_end = .;
- }
- SECURITY_INIT
- . = ALIGN(4);
- .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {
- __alt_instructions = .;
- KEEP(*(.altinstructions))
- __alt_instructions_end = .;
- }
- .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {
- /* No need to KEEP - referenced by .altinstructions */
- *(.altinstr_replacement)
- }
- . = ALIGN(4);
- .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) {
- __parainstructions = .;
- KEEP(*(.parainstructions))
- __parainstructions_end = .;
- }
- /* .exit.text is discarded at runtime, not link time, to deal with references
- from .altinstructions and .eh_frame */
- .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { *(.exit.text) }
- .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { *(.exit.data) }
-#if defined(CONFIG_BLK_DEV_INITRD)
- . = ALIGN(4096);
- .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
- __initramfs_start = .;
- KEEP(*(.init.ramfs))
- __initramfs_end = .;
+ /* TODO: can .exit.data be discarded at link time? */
+ *(.exit.data)
}
-#endif
. = ALIGN(4096);
.percpu.data : AT(ADDR(.percpu.data) - LOAD_OFFSET) {
__per_cpu_start = .;
- *(.percpu.data)
+ *(SORT_BY_ALIGNMENT(.percpu.data))
+ /* Dont move in front of .percpu.data, .percpu.data contains page-aligned stuff */
*(.percpu.shared_aligned.data)
__per_cpu_end = .;
}
- . = ALIGN(4096);
/* End of "freed after init" portion */
+ . = ALIGN(4096);
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
__init_end = .;
__bss_start = .; /* BSS */
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-09-12 20:46 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-09-12 20:24 [PATCH 1/2] section garbage collection for i386 Denys Vlasenko
2007-09-12 20:30 ` [PATCH 2/2] " Denys Vlasenko
2007-09-12 20:45 ` [PATCH 3/2] section garbage collection for i386 - BONUS TRACK Denys Vlasenko
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.