[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bug binutils/4007] New: problems with linker / strip / BFD
From: |
etienne_lorrain at yahoo dot fr |
Subject: |
[Bug binutils/4007] New: problems with linker / strip / BFD |
Date: |
8 Feb 2007 19:07:05 -0000 |
I just want to report that, I do not know if it shall be considered as a bug,
as bad use, as undocumented feature:
Lets compile some Linux kernel with Fedora 6 default toolchain:
address@hidden ~]$ ld --version
GNU ld version 2.17.50.0.3-6 20060715
address@hidden ~]$ readelf -v
GNU readelf 2.17.50.0.3-6 20060715
address@hidden tmp]$ tar xjf ../linux2/linux-2.6.20.tar.bz2
address@hidden tmp]$ cd linux-2.6.20
address@hidden linux-2.6.20]$ cp ../../linux2/linux-2.6.20-gujin/.config .
address@hidden linux-2.6.20]$ make oldconfig > log
address@hidden linux-2.6.20]$ make vmlinux >> log
... few warnings ...
address@hidden linux-2.6.20]$ readelf -l vmlinux
Elf file type is EXEC (Executable file)
Entry point 0x100000
There are 3 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x001000 0xc0100000 0x00100000 0x3995e0 0x3995e0 R E 0x1000
LOAD 0x39b000 0xc049a000 0x0049a000 0x75085 0xaf000 RWE 0x1000
NOTE 0x000000 0x00000000 0x00000000 0x00000 0x00000 R 0x4
Section to Segment mapping:
Segment Sections...
00 .text __ex_table .rodata .pci_fixup __param
01 .data .data_nosave .data.page_aligned .data.cacheline_aligned
.data.read_mostly
.data.init_task .init.text .init.data .init.setup .initcall.init
.con_initcall.init
.security_initcall.init .altinstructions .altinstr_replacement .exit.text
.init.ramfs
.bss
02
address@hidden linux-2.6.20]$
OK, everything is fine. The ld script affects manually the program header by:
/* arch/i386/kernel/vmlinux.lds.S */
PHDRS {
text PT_LOAD FLAGS(5); /* R_E */
data PT_LOAD FLAGS(7); /* RWE */
note PT_NOTE FLAGS(4); /* R__ */
}
And the text section goes to the :text program header, it is linked at a fixed
address.
.text : AT(ADDR(.text) - LOAD_OFFSET) {
...
} :text = 0x9090
Now I want to create another text section - I was thinking that a new program
header would be added or an error message because I create it a another address,
using the patch at sourceforge at:
http://sourceforge.net/project/showfiles.php?group_id=15465&package_id=174813&release_id=482035
The important extract is:
SECTIONS
{
.realmode 0 : AT (ADDR(.bss) + SIZEOF(.bss) - LOAD_OFFSET) {
... all my sections ...
} :text = 0x9090
. = 0xc0000000 ; /* or more */
.text : AT(ADDR(.text) - LOAD_OFFSET) {
... original part ...
} :text = 0x9090
address@hidden linux-2.6.20]$ patch -p1 < ../../linux/gujin-patch-2.6.20-rc5
patching file arch/i386/Kconfig
patching file arch/i386/kernel/Makefile
patching file arch/i386/kernel/realmode.c
patching file arch/i386/kernel/setup.c
patching file arch/i386/kernel/vmlinux.lds.S
patching file arch/i386/Makefile
patching file include/asm-i386/realmode.h
patching file Makefile
patching file scripts/gzcopy.c
patching file scripts/gzparam.c
address@hidden linux-2.6.20]$ make linux-2.6.20.kgz > log
But nothing change and I do not get any warning or error for a section
containing code not linked to a program header:
address@hidden linux-2.6.20]$ readelf -l vmlinux
Elf file type is EXEC (Executable file)
Entry point 0x100000
There are 3 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x001000 0xc0100000 0x00100000 0x44a830 0x44a830 R E 0x1000
LOAD 0x44c000 0xc049a000 0x0049a000 0x75085 0xaf000 RWE 0x1000
NOTE 0x000000 0x00000000 0x00000000 0x00000 0x00000 R 0x4
Section to Segment mapping:
Segment Sections...
00 .bss .text __ex_table .rodata .pci_fixup __param .data .data_nosave
.data.page_aligned .data.cacheline_aligned .data.read_mostly .data.init_task
.init.text
.init.data .init.setup .initcall.init .con_initcall.init .security_initcall.init
.altinstructions .altinstr_replacement .exit.text .init.ramfs
01 .bss .data .data_nosave .data.page_aligned .data.cacheline_aligned
.data.read_mostly .data.init_task .init.text .init.data .init.setup
.initcall.init
.con_initcall.init .security_initcall.init .altinstructions
.altinstr_replacement
.exit.text .init.ramfs
02
address@hidden linux-2.6.20]$
And there is something wrong once using strip from this file:
address@hidden linux-2.6.20]$ objcopy -S vmlinux vmlinux.stripped
BFD: vmlinux.stripped: warning: allocated section `.realmode' not in segment
address@hidden linux-2.6.20]$ readelf -l vmlinux.stripped
Elf file type is EXEC (Executable file)
Entry point 0x100000
There are 3 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x001000 0xc0100000 0x00100000 0x40f085 0x449000 R E 0x1000
LOAD 0x411000 0xc049a000 0x0049a000 0x75085 0xaf000 RWE 0x1000
NOTE 0x000000 0x00000000 0x00000000 0x00000 0x00000 R 0x4
Section to Segment mapping:
Segment Sections...
00 .bss .text __ex_table .rodata .pci_fixup __param .data .data_nosave
.data.page_aligned .data.cacheline_aligned .data.read_mostly .data.init_task
.init.text
.init.data .init.setup .initcall.init .con_initcall.init .security_initcall.init
.altinstructions .altinstr_replacement .exit.text .init.ramfs
01 .bss .data .data_nosave .data.page_aligned .data.cacheline_aligned
.data.read_mostly .data.init_task .init.text .init.data .init.setup
.initcall.init
.con_initcall.init .security_initcall.init .altinstructions
.altinstr_replacement
.exit.text .init.ramfs
02
address@hidden linux-2.6.20]$
Note that the first program header MemSiz overlap the second program header:
0x00100000 + 0x449000 > 0x0049a000
And the two FileSiz are not aligned so the memset at PhysAddr+FileSiz is done
at an unaligned address so will be slow.
I do not know what should be the behaviour, just something seems wrong.
Something completely different, when using the linux patch I posted on LKM,
where a new program header is created for this section, and is removed if i want
to get rid of the section .realmode completely because I want to generate the
old target, you can ask me the question:
address@hidden linux-2.6.20-gujin]$ objcopy -R .note -R .comment -R .realmode -S
vmlinux vmlinux.tmp
BFD: vmlinux: warning: Empty loadable segment detected, is this intentional ?
address@hidden linux-2.6.20-gujin]$
My answer is that it is not needed to keep this empty loadable segment, you can
strip it.
I do not care of the warning because that command is used "-O binary" by Linux
Makefile and does not produce the warning.
Thanks,
Etienne.
--
Summary: problems with linker / strip / BFD
Product: binutils
Version: 2.17
Status: NEW
Severity: normal
Priority: P2
Component: binutils
AssignedTo: unassigned at sources dot redhat dot com
ReportedBy: etienne_lorrain at yahoo dot fr
CC: bug-binutils at gnu dot org
GCC build triplet: i386-redhat-linux
GCC host triplet: i386-redhat-linux
GCC target triplet: i386-redhat-linux
http://sourceware.org/bugzilla/show_bug.cgi?id=4007
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
- [Bug binutils/4007] New: problems with linker / strip / BFD,
etienne_lorrain at yahoo dot fr <=
- [Bug binutils/4007] problems with linker / strip / BFD, hjl at lucon dot org, 2007/02/14
- [Bug binutils/4007] problems with linker / strip / BFD, etienne_lorrain at yahoo dot fr, 2007/02/15
- [Bug binutils/4007] problems with linker / strip / BFD, hjl at lucon dot org, 2007/02/23
- [Bug binutils/4007] problems with linker / strip / BFD, etienne_lorrain at yahoo dot fr, 2007/02/23
- [Bug binutils/4007] Linker failed to issue an error on bad section in segment, hjl at lucon dot org, 2007/02/23
- [Bug binutils/4007] Linker failed to issue an error on bad section in segment, hjl at lucon dot org, 2007/02/26
- [Bug binutils/4007] Linker failed to issue an error on bad section in segment, etienne_lorrain at yahoo dot fr, 2007/02/27