From ca4fa240d6b9d4d7a2b3131ae47689530351674b Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 15 Apr 2003 09:38:11 +0000 Subject: [PATCH] Properly report filename for alignment reduction. Add test for alignment reduction. --- bfd/ChangeLog | 5 ++ bfd/elflink.h | 26 ++++++++--- ld/testsuite/ChangeLog | 8 ++++ ld/testsuite/ld-elfcomm/common1a.c | 2 + ld/testsuite/ld-elfcomm/common1b.c | 3 ++ ld/testsuite/ld-elfcomm/elfcomm.exp | 92 +++++++++++++++++++++++++++++++++++++ 6 files changed, 130 insertions(+), 6 deletions(-) create mode 100644 ld/testsuite/ld-elfcomm/common1a.c create mode 100644 ld/testsuite/ld-elfcomm/common1b.c create mode 100644 ld/testsuite/ld-elfcomm/elfcomm.exp diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 080cc0c..b253ee6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2003-04-15 H.J. Lu + + * elflink.h (elf_link_add_object_symbols): Properly report + filename for alignment reduction. + 2003-04-15 Rohit Kumar Srivastava * archures.c: Replace occurrances of 'Hitachi' with 'Renesas'. diff --git a/bfd/elflink.h b/bfd/elflink.h index 780e341..12f91ef 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -1929,7 +1929,11 @@ elf_link_add_object_symbols (abfd, info) if ((old_alignment || isym->st_shndx == SHN_COMMON) && h->root.type != bfd_link_hash_common) { - unsigned int common_align, normal_align, symbol_align; + unsigned int common_align; + unsigned int normal_align; + unsigned int symbol_align; + bfd *normal_bfd; + bfd *common_bfd; symbol_align = ffs (h->root.u.def.value) - 1; if ((h->root.u.def.section->owner->flags & DYNAMIC) == 0) @@ -1942,16 +1946,26 @@ elf_link_add_object_symbols (abfd, info) normal_align = symbol_align; if (old_alignment) - common_align = old_alignment; + { + common_align = old_alignment; + common_bfd = old_bfd; + normal_bfd = abfd; + } else - common_align = bfd_log2 (isym->st_value); + { + common_align = bfd_log2 (isym->st_value); + common_bfd = abfd; + normal_bfd = old_bfd; + } if (normal_align < common_align) (*_bfd_error_handler) (_("Warning: alignment %u of symbol `%s' in %s is smaller than %u in %s"), - 1 << normal_align, name, - bfd_archive_filename (old_bfd), - 1 << common_align, bfd_archive_filename (abfd)); + 1 << normal_align, + name, + bfd_archive_filename (normal_bfd), + 1 << common_align, + bfd_archive_filename (common_bfd)); } /* Remember the symbol size and type. */ diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index c4105f1..b9cf349 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2003-04-14 H.J. Lu + + * ld-elfcom: New directory. + * ld-elfcom/elfcom.exp: New file: Test alignment of common symbols + under ELF. + * ld-elfcom/common1a.c: New file: Test source code. + * ld-elfcom/common1b.c: New file: Test source code. + 2003-04-15 Rohit Kumar Srivastava * ld-sh/sh64/crange3-cmpct.rd: Replace occurrances of 'Hitachi' diff --git a/ld/testsuite/ld-elfcomm/common1a.c b/ld/testsuite/ld-elfcomm/common1a.c new file mode 100644 index 0000000..eb8fbef --- /dev/null +++ b/ld/testsuite/ld-elfcomm/common1a.c @@ -0,0 +1,2 @@ +char foo1 [2] __attribute__((aligned(64))); +char foo2 [2] __attribute__((aligned(128))); diff --git a/ld/testsuite/ld-elfcomm/common1b.c b/ld/testsuite/ld-elfcomm/common1b.c new file mode 100644 index 0000000..4ed9e03 --- /dev/null +++ b/ld/testsuite/ld-elfcomm/common1b.c @@ -0,0 +1,3 @@ +static char dummy1 = 'X'; +char foo1 [] = "Aligned at odd byte."; +char foo2 [4]; diff --git a/ld/testsuite/ld-elfcomm/elfcomm.exp b/ld/testsuite/ld-elfcomm/elfcomm.exp new file mode 100644 index 0000000..199e83e --- /dev/null +++ b/ld/testsuite/ld-elfcomm/elfcomm.exp @@ -0,0 +1,92 @@ +# Expect script for commom symbol tests +# Copyright 2003 Free Software Foundation, Inc. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Written by H.J. Lu (hjl@gnu.org) +# + +# Make sure that ld correctly handles common symbols in ELF. + +# This test can only be run on ELF platforms. +# Square bracket expressions seem to confuse istarget. +if { ![istarget hppa*64*-*-hpux*] \ + && ![istarget *-*-gnu] \ + && ![istarget *-*-linux*] \ + && ![istarget *-*-elf] } { + return +} + +if { [istarget *-*-linux*aout*] \ + || [istarget *-*-linux*oldld*] } { + return +} + +proc dump_common1 { testname } { + global exec_output + + send_log "readelf -s tmpdir/common1.o | grep foo\n" + catch "exec readelf -s tmpdir/common1.o | grep foo" exec_output + if { ![regexp "(\[ \]*)(\[0-9\]+):(\[ \]*)(\[0\]*)80(\[ \]+)4(\[ \]+)OBJECT(\[ \]+)GLOBAL(\[ \]+)DEFAULT(\[ \]+)COM(\[ \]+)foo2" $exec_output] + || ![regexp "(\[ \]*)(\[0-9\]+):(\[ \]*)(\[0\]*)1(\[ \]+)21(\[ \]+)OBJECT(\[ \]+)GLOBAL(\[ \]+)DEFAULT(\[ \]+)(\[0-9\]+)(\[ \]+)foo1" $exec_output] } { + send_log "$exec_output\n" + verbose $exec_output + fail $testname + return 0 + } + + return 1 +} + +set test1 "size/aligment change of commom symbols" +if { ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/common1a.c tmpdir/common1a.o] + || ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/common1b.c tmpdir/common1b.o] } { + unresolved $test1 + return +} + +global ld +global link_output + +if { [ld_simple_link $ld tmpdir/common1.o "-r tmpdir/common1a.o tmpdir/common1b.o"] } { + unresolved $test1 + return +} + +if { ![regexp "Warning: alignment 1 of symbol \`foo1\' in tmpdir/common1b.o is smaller than 64 in tmpdir/common1a.o" $link_output] + || ![regexp "Warning: size of symbol \`foo1\' changed from 2 in tmpdir/common1a.o to 21 in tmpdir/common1b.o" $link_output] } { + fail "$test1 (warning 1)" +} else { + pass "$test1 (warning 1)" +} + +if { [dump_common1 "$test1 (change 1)"] } { + pass "$test1 (change 1)" +} + +if { [ld_simple_link $ld tmpdir/common1.o "-r tmpdir/common1b.o tmpdir/common1a.o"] } { + unresolved $test1 + return +} + +if { ![regexp "Warning: alignment 1 of symbol \`foo1\' in tmpdir/common1b.o is smaller than 64 in tmpdir/common1a.o" $link_output] } { + fail "$test1 (warning 2)" +} else { + pass "$test1 (warningi 2)" +} + +if { [dump_common1 "$test1 (change 2)"] } { + pass "$test1 (change 2)" +} -- 2.7.4