public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] Fix for gdb.base/solib-search.exp test.
@ 2022-04-21 20:09 Carl Love
  0 siblings, 0 replies; only message in thread
From: Carl Love @ 2022-04-21 20:09 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=83ac2319e75a6313e17265d18820487e80dd9619

commit 83ac2319e75a6313e17265d18820487e80dd9619
Author: Carl Love <cel@us.ibm.com>
Date:   Tue Mar 22 15:23:44 2022 -0500

    Fix for gdb.base/solib-search.exp test.
    
    The variable right_lib_flags is not being set correctly to define RIGHT.
    The value RIGHT is needed to force the address of the library functions
    lib1_func3 and lib2_func4 to occur at different address in the wrong and
    right libraries.
    
    With RIGHT defined correctly, functions lib1_func3 and lib2_func4 occur
    at different addresses the test runs correctly on Powerpc.
    
    The test needs the lib2 addresses to be different in the right and
    wrong cases.  That is the point of introducing function lib2_spacer
    with the ifdef RIGHT compiler directive.
    
    On Intel, the ARRAY_SIZE of 1 versus 8192 is sufficient to get the
    dynamic linker to move the addresses of the library.  You can also get
    the same effect on PowerPC but you must use a value much larger than
    8192.
    
    The key thing is that the test was not properly setting RIGHT to
    defined to get the lib2_spacer function on Intel and Powerpc.
    
    Without the patch, we have the Intel backtrace for the bad libraries:
    
    backtrace
    #0  break_here () at /home/ ... /gdb/testsuite/gdb.base/solib-search.c:30
    #1  0x00007ffff7fae156 in ?? ()
    #2  0x00007fffffffc150 in ?? ()
    #3  0x00007ffff7fbb156 in ?? ()
    #4  0x00007fffffffc160 in ?? ()
    #5  0x00007ffff7fae146 in ?? ()
    #6  0x00007fffffffc170 in ?? ()
    #7  0x00007ffff7fbb146 in ?? ()
    #8  0x00007fffffffc180 in ?? ()
    #9  0x0000555555555156 in main () at /home/ ... /binutils-gdb/gdb/testsuite/gdb.base/solib-search.c:23
    Backtrace stopped: previous frame inner to this frame (corrupt stack?)
    (gdb) PASS: gdb.base/solib-search.exp: backtrace (with wrong libs) (data collection)
    
    The backtrace on Intel with the good libraries is:
    
    backtrace
    #0  break_here () at /.../binutils-gdb/gdb/testsuite/gdb.base/solib-search.c:30
    #1  0x00007ffff7fae156 in lib2_func4 () at /.../binutils-gdb/gdb/testsuite/gdb.base/solib-search-lib2.c:49
    #2  0x00007ffff7fbb156 in lib1_func3 () at /.../gdb.base/solib-search-lib1.c:49
    #3  0x00007ffff7fae146 in lib2_func2 () at /.../testsuite/gdb.base/solib-search-lib2.c:30
    #4  0x00007ffff7fbb146 in lib1_func1 () at /.../gdb.base/solib-search-lib1.c:30
    #5  0x0000555555555156 in main () at /...solib-search.c:23
    (gdb) PASS: gdb.base/solib-search.exp: backtrace (with right libs) (data collection)
    PASS: gdb.base/solib-search.exp: backtrace (with right libs)
    
    In one case the backtrace is correct and the other it
    is wrong on Intel.  This is due to the fact that the ARRAY_SIZE caused
    the dynamic linker to move the library function addresses around.  I
    believe it has to do with the default size of the data and code
    sections used by the dynamic linker.
    
    So without the patch the backtrace on PowerPC looks like:
    
     backtrace
    #0  break_here () at /.../solib-search.c:30
    #1  0x00007ffff7f007f4 in lib2_func4 () at /.../solib-search-lib2.c:49
    #2  0x00007ffff7f307f4 in lib1_func3 () at /.../solib-search-lib1.c:49
    #3  0x00007ffff7f007ac in lib2_func2 () at /.../solib-search-lib2.c:30
    #4  0x00007ffff7f307ac in lib1_func1 () at /.../solib-search-lib1.c:30
    #5  0x000000001000074c in main () at /.../solib-search.c:23
    
    for both the good and bad libraries.
    
    The patch fixes defining RIGHT in solib-search-lib1.c and solib-search-
    lib2.c.  Note, without the patch the lib1_spacer and lib2_spacer
    functions do not show up in the object dump of the Intel or Powerpc
    libraries as it should.  The patch fixes that by making sure RIGHT gets
    defined.
    
    Now with the patch the backtrace for the bad library on PowerPC looks
    like:
    
    backtrace
    #0  break_here () at /.../solib-search.c:30
    #1  0x00007ffff7f0083c in __glink_PLTresolve () from /.../solib-search-lib2.so
    Backtrace stopped: frame did not save the PC
    
    And the backtrace for the good libraries on PowerPC looks like:
    
    backtrace
    #0  break_here () at /.../solib-search.c:30
    #1  0x00007ffff7f0083c in lib2_func4 () at /.../solib-search-lib2.c:49
    #2  0x00007ffff7f3083c in lib1_func3 () at /.../solib-search-lib1.c:49
    #3  0x00007ffff7f007cc in lib2_func2 () at /.../solib-search-lib2.c:30
    #4  0x00007ffff7f307cc in lib1_func1 () at /.../solib-search-lib1.c:30
    #5  0x000000001000074c in main () at /.../solib-search.c:23
    (gdb) PASS: gdb.base/solib-search.exp: backtrace (with right libs) (data collection)
    PASS: gdb.base/solib-search.exp: backtrace (with right libs)
    
    The issue then is on Power where the ARRAY_SIZE of 1 versus 8192 is not
    sufficient to cause the dymanic linker to allocate the libraries at
    different addresses.  I don't claim to understand the specifics of how
    the dynamic linker works and what the default size is for the data and
    code sections are.  My guess is by default PowerPC allocates a larger
    data size by default, which is large enough to hold array[8192].  The
    default size of the data section allocated by the dynamic linker on
    Intel is not large enough to hold array[8192] thus causing the code
    section on Intel to have to move when the large array is defined.
    
    Note on PowerPC, if you make ARRAY_SIZE big enough, then you will cause
    the library addresses to occur at different addresses as the larger
    data section forces the code section to a different address.  That was
    actually my original fix for the program until I spoke with Doug Evans
    who originally wrote the test.  Doug noticed that RIGHT was not getting
    defined as he originally intended in the test.
    
    With the patch to fix the definition of RIGHT, PowerPC has a bad and a
    good backtrace because the address of lib1_func3 and lib2_func4 both
    move because lib1_spacer and lib2_spacer are now defined
    before lib1_func3 and lib2_func4.
    
    Without the patch, the lib1_spacer and lib2_spacer function doesn't show
    up in the binary for the correct or incorrect library on Intel or PowerPC.
    With the patch, RIGHT gets defined as originally intended for the test on
    both architectures and lib1_spacer and lib2_spacer function show up in the
    binaries on both architectures changing the other function addresses as
    intended thus causing the test work as intended on PowerPC.

Diff:
---
 gdb/testsuite/gdb.base/solib-search.exp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gdb/testsuite/gdb.base/solib-search.exp b/gdb/testsuite/gdb.base/solib-search.exp
index eaabe508bf0..202e79d85de 100644
--- a/gdb/testsuite/gdb.base/solib-search.exp
+++ b/gdb/testsuite/gdb.base/solib-search.exp
@@ -54,7 +54,7 @@ set binfile2_lib [standard_output_file ${libname2}.so]
 
 set lib_flags [list debug ldflags=-Wl,-Bsymbolic]
 set wrong_lib_flags "$lib_flags additional_flags=-DARRAY_SIZE=1"
-set right_lib_flags "$lib_flags additional_flags=-DARRAY_SIZE=8192 -DRIGHT"
+set right_lib_flags "$lib_flags additional_flags=-DARRAY_SIZE=8192 additional_flags=-DRIGHT"
 
 # Binary file.
 standard_testfile .c


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-04-21 20:09 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-21 20:09 [binutils-gdb] Fix for gdb.base/solib-search.exp test Carl Love

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).