mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-03 13:23:00 +08:00
execl-update-breakpoints.exp: Move whole segment instead of .text section
The test case builds two copies of the program, one with the compile option "ldflags=-Wl,-Ttext=0x1000000" and the other with the address changed to 0x2000000. However, when linking with ld.bfd, the resulting executables crash early in ld.so on S390 and i386. Analysis of the crash: The default linker script establishes a certain order of loadable sections, and the option "-Ttext" effectively splits these into an "unaffected" lot (everything before .text) and an "affected" lot. The affected lot is placed at the given address, whereas the unaffected lot stays at its default address. The unaffected lot starts at an aligned address plus Elf header sizes, which is good if it is the first LOAD segment (like on AMD64). But if the affected lot comes first instead (like on S390 and i386), the PHDR doesn't fit there and is placed *outside* any LOAD segments. Then the PHDR is not mapped when the loader gets control, and the loader runs into a segmentation fault while trying to access it. Since we are lucky about the order of segments on AMD64, the test succeeds there, but the resulting binaries are unusually large -- 2.1M each, with lots of padding within. When replacing '-Ttext' by '-Ttext-segment', the linker moves all segments consistently, the binaries have normal sizes, and the test case succeeds on all mentioned platforms. Since old versions of the gold linker don't support '-Ttext-segment', the patch also adds logic for falling back to '-Ttext'. gdb/testsuite/ChangeLog: * gdb.base/execl-update-breakpoints.exp: Specify the link address with '-Ttext-segment' instead of '-Ttext'. Fall back to '-Ttext' if the linker doesn't understand this.
This commit is contained in:

committed by
Andreas Krebbel

parent
538baf8b7e
commit
fdb09caf23
@ -1,3 +1,9 @@
|
||||
2014-12-02 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||
|
||||
* gdb.base/execl-update-breakpoints.exp: Specify the link address
|
||||
with '-Ttext-segment' instead of '-Ttext'. Fall back to '-Ttext'
|
||||
if the linker doesn't understand this.
|
||||
|
||||
2014-12-01 Simon Marchi <simon.marchi@ericsson.com>
|
||||
|
||||
* gdb.python/python.exp: Change expected reply to help().
|
||||
|
@ -28,17 +28,31 @@ standard_testfile
|
||||
# The address of "main" in the first binary should end up being an
|
||||
# unmapped address in the second binary.
|
||||
|
||||
set exec1 ${testfile}1
|
||||
set exec2 ${testfile}2
|
||||
set binfile1 ${binfile}1
|
||||
set binfile2 ${binfile}2
|
||||
set objfile ${binfile}.o
|
||||
set exec1 ${binfile}1
|
||||
set exec2 ${binfile}2
|
||||
|
||||
if { [prepare_for_testing "failed to prepare" ${exec1} "${srcfile}" \
|
||||
[list debug ldflags=-Wl,-Ttext=0x1000000]] } {
|
||||
if { [gdb_compile [file join $srcdir $subdir $srcfile] $objfile \
|
||||
object [list debug]] != "" } {
|
||||
untested "compile failed"
|
||||
return -1
|
||||
}
|
||||
if { [prepare_for_testing "failed to prepare" ${exec2} "${srcfile}" \
|
||||
[list debug ldflags=-Wl,-Ttext=0x2000000]] } {
|
||||
|
||||
set opts1_ld [list debug ldflags=-Wl,-Ttext-segment=0x1000000]
|
||||
set opts1_gold [list debug ldflags=-Wl,-Ttext=0x1000000]
|
||||
set opts2_ld [list debug ldflags=-Wl,-Ttext-segment=0x2000000]
|
||||
set opts2_gold [list debug ldflags=-Wl,-Ttext=0x2000000]
|
||||
|
||||
if { [gdb_compile $objfile $exec1 executable $opts1_ld] != "" } {
|
||||
# Old gold linker versions don't support -Ttext-segment. Fall
|
||||
# back to -Ttext.
|
||||
if { [gdb_compile $objfile $exec1 executable $opts1_gold] != ""
|
||||
|| [gdb_compile $objfile $exec2 executable $opts2_gold] != ""} {
|
||||
untested "link failed"
|
||||
return -1
|
||||
}
|
||||
} elseif { [gdb_compile $objfile $exec2 executable $opts2_ld] != "" } {
|
||||
untested "link failed"
|
||||
return -1
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user