From: H.J. Lu Date: Wed, 22 Jul 2015 10:36:42 +0000 (-0700) Subject: Don't compare symbol addresses directly X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5b2af7dd40a4f3b570aef71daf11b9dfce9a5d13;p=binutils-gdb.git Don't compare symbol addresses directly GCC 5 will fold symbol address comparison, assuming each symbol has a different address, which leads to abort. We should use separate functions to compare symbol address. PR gold/18663 * testsuite/Makefile.am (script_test_1_SOURCES): Set to script_test_1a.cc script_test_1b.cc. (script_test_11_r.o): Replace script_test_11.o with script_test_11a.o script_test_11b.o. (script_test_11.o): Removed. (script_test_11a.o): New. (script_test_11b.o): Likewise. * testsuite/Makefile.in: Regenerated. * testsuite/script_test_1.h: New file. * testsuite/script_test_1b.cc: Likewise. * testsuite/script_test_11.h: Likewise. * testsuite/script_test_11b.c: Likewise. * testsuite/script_test_1.cc: Renamed to ... * testsuite/script_test_1a.cc: This. Include "script_test_1.h". (main): Call check_int and check_ptr. * testsuite/script_test_11.c: Renamed to ... * testsuite/script_test_11a.c: This. Include "script_test_11.h". (main): Call ptr_equal. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 45daaa573a0..2977734f3ce 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,27 @@ +2015-07-22 H.J. Lu + + PR gold/18663 + * testsuite/Makefile.am (script_test_1_SOURCES): Set to + script_test_1a.cc script_test_1b.cc. + (script_test_11_r.o): Replace script_test_11.o with + script_test_11a.o script_test_11b.o. + (script_test_11.o): Removed. + (script_test_11a.o): New. + (script_test_11b.o): Likewise. + * testsuite/Makefile.in: Regenerated. + * testsuite/script_test_1.h: New file. + * testsuite/script_test_1b.cc: Likewise. + * testsuite/script_test_11.h: Likewise. + * testsuite/script_test_11b.c: Likewise. + * testsuite/script_test_1.cc: Renamed to ... + * testsuite/script_test_1a.cc: This. + Include "script_test_1.h". + (main): Call check_int and check_ptr. + * testsuite/script_test_11.c: Renamed to ... + * testsuite/script_test_11a.c: This. + Include "script_test_11.h". + (main): Call ptr_equal. + 2015-07-22 H.J. Lu PR gold/18628 diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index 4b0027397e5..ca070163a72 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -1636,7 +1636,7 @@ relro_script_test.so: gcctestdir/ld relro_script_test.t relro_test_pic.o $(CXXLINK) -Bgcctestdir/ -shared -Wl,-z,relro -Wl,-T,$(srcdir)/relro_script_test.t relro_test_pic.o check_PROGRAMS += script_test_1 -script_test_1_SOURCES = script_test_1.cc +script_test_1_SOURCES = script_test_1a.cc script_test_1b.cc script_test_1_DEPENDENCIES = gcctestdir/ld script_test_1.t script_test_1_LDFLAGS = -Bgcctestdir/ -Wl,-R,. -Wl,-T,$(srcdir)/script_test_1.t script_test_1_LDADD = @@ -1769,9 +1769,11 @@ script_test_9.stdout: script_test_9 check_PROGRAMS += script_test_11 script_test_11: gcctestdir/ld script_test_11_r.o $(LINK) -Bgcctestdir/ script_test_11_r.o -script_test_11_r.o: gcctestdir/ld $(srcdir)/script_test_11.t script_test_11.o - gcctestdir/ld -r -o $@ -T $(srcdir)/script_test_11.t script_test_11.o -script_test_11.o: script_test_11.c +script_test_11_r.o: gcctestdir/ld $(srcdir)/script_test_11.t script_test_11a.o script_test_11b.o + gcctestdir/ld -r -o $@ -T $(srcdir)/script_test_11.t script_test_11a.o script_test_11b.o +script_test_11a.o: script_test_11a.c + $(COMPILE) -c -g -o $@ $< +script_test_11b.o: script_test_11b.c $(COMPILE) -c -g -o $@ $< # Test difference between "*(a b)" and "*(a) *(b)" in input section spec. diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in index 720558bacc1..d4cc5dca69e 100644 --- a/gold/testsuite/Makefile.in +++ b/gold/testsuite/Makefile.in @@ -1706,7 +1706,8 @@ relro_test_OBJECTS = $(am_relro_test_OBJECTS) relro_test_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(relro_test_LDFLAGS) $(LDFLAGS) -o $@ @GCC_TRUE@@NATIVE_LINKER_TRUE@am_script_test_1_OBJECTS = \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_1.$(OBJEXT) +@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_1a.$(OBJEXT) \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_1b.$(OBJEXT) script_test_1_OBJECTS = $(am_script_test_1_OBJECTS) script_test_1_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(script_test_1_LDFLAGS) $(LDFLAGS) -o $@ @@ -2838,7 +2839,7 @@ LDADD = libgoldtest.a ../libgold.a ../../libiberty/libiberty.a $(LIBINTL) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_script_test_DEPENDENCIES = gcctestdir/ld relro_script_test.so @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_script_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,. @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_script_test_LDADD = relro_script_test.so -@GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_1_SOURCES = script_test_1.cc +@GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_1_SOURCES = script_test_1a.cc script_test_1b.cc @GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_1_DEPENDENCIES = gcctestdir/ld script_test_1.t @GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_1_LDFLAGS = -Bgcctestdir/ -Wl,-R,. -Wl,-T,$(srcdir)/script_test_1.t @GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_1_LDADD = @@ -3986,10 +3987,11 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protected_main_2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protected_main_3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relro_test_main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/script_test_1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/script_test_11.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/script_test_12.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/script_test_12i.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/script_test_1a.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/script_test_1b.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/script_test_2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/script_test_2a.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/script_test_2b.Po@am__quote@ @@ -5828,9 +5830,11 @@ uninstall-am: @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_READELF) -lW script_test_9 > script_test_9.stdout @GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_11: gcctestdir/ld script_test_11_r.o @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(LINK) -Bgcctestdir/ script_test_11_r.o -@GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_11_r.o: gcctestdir/ld $(srcdir)/script_test_11.t script_test_11.o -@GCC_TRUE@@NATIVE_LINKER_TRUE@ gcctestdir/ld -r -o $@ -T $(srcdir)/script_test_11.t script_test_11.o -@GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_11.o: script_test_11.c +@GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_11_r.o: gcctestdir/ld $(srcdir)/script_test_11.t script_test_11a.o script_test_11b.o +@GCC_TRUE@@NATIVE_LINKER_TRUE@ gcctestdir/ld -r -o $@ -T $(srcdir)/script_test_11.t script_test_11a.o script_test_11b.o +@GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_11a.o: script_test_11a.c +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(COMPILE) -c -g -o $@ $< +@GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_11b.o: script_test_11b.c @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(COMPILE) -c -g -o $@ $< @GCC_TRUE@@NATIVE_LINKER_TRUE@script_test_12: gcctestdir/ld $(srcdir)/script_test_12.t script_test_12a.o script_test_12b.o @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(LINK) -Bgcctestdir/ -Wl,-T,$(srcdir)/script_test_12.t script_test_12a.o script_test_12b.o diff --git a/gold/testsuite/script_test_1.cc b/gold/testsuite/script_test_1.cc deleted file mode 100644 index 32ff1023be5..00000000000 --- a/gold/testsuite/script_test_1.cc +++ /dev/null @@ -1,47 +0,0 @@ -// script_test_1.cc -- linker script test 1 for gold -*- C++ -*- - -// Copyright (C) 2008-2015 Free Software Foundation, Inc. -// Written by Ian Lance Taylor . - -// This file is part of gold. - -// This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston, -// MA 02110-1301, USA. - -// A test for a linker script which sets symbols to values. - -#include -#include -#include - -extern char a, b, c, d, e, f, g; -int sym = 3; -int common_sym; - -int -main(int, char**) -{ - assert(reinterpret_cast(&a) == 123); - assert(reinterpret_cast(&b) == reinterpret_cast(&a) * 2); - assert(reinterpret_cast(&c) - == reinterpret_cast(&b) + 3 * 6); - assert(reinterpret_cast(&d) - == (reinterpret_cast(&b) + 3) * 6); - assert(reinterpret_cast(&e) == &sym); - assert(reinterpret_cast(&f) - == reinterpret_cast(&sym) + 10); - assert(reinterpret_cast(&g) == &common_sym); - return 0; -} diff --git a/gold/testsuite/script_test_1.h b/gold/testsuite/script_test_1.h new file mode 100644 index 00000000000..5c23c549cb8 --- /dev/null +++ b/gold/testsuite/script_test_1.h @@ -0,0 +1,25 @@ +// script_test_1.h -- linker script test 1 for gold -*- C++ -*- + +// Copyright (C) 2015 Free Software Foundation, Inc. + +// This file is part of gold. + +// This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +#include + +extern void check_int(intptr_t, intptr_t); +extern void check_ptr(int *, int *); diff --git a/gold/testsuite/script_test_11.c b/gold/testsuite/script_test_11.c deleted file mode 100644 index d932813c7bb..00000000000 --- a/gold/testsuite/script_test_11.c +++ /dev/null @@ -1,16 +0,0 @@ -static unsigned int buffer1[256] __attribute((used)); -static unsigned int buffer2[256] __attribute((used)) = { 1 }; - -unsigned int foo __attribute__((section(".foo"))); -extern char __foo_start; -extern char __foo_end; - -int -main (void) -{ - if (&__foo_end - &__foo_start != sizeof(foo)) - return 1; - if (&__foo_start != (char *)&foo) - return 2; - return 0; -} diff --git a/gold/testsuite/script_test_11.h b/gold/testsuite/script_test_11.h new file mode 100644 index 00000000000..959a8abc5c6 --- /dev/null +++ b/gold/testsuite/script_test_11.h @@ -0,0 +1 @@ +extern int ptr_equal(char *, char *); diff --git a/gold/testsuite/script_test_11a.c b/gold/testsuite/script_test_11a.c new file mode 100644 index 00000000000..9e698779e3b --- /dev/null +++ b/gold/testsuite/script_test_11a.c @@ -0,0 +1,18 @@ +#include "script_test_11.h" + +static unsigned int buffer1[256] __attribute((used)); +static unsigned int buffer2[256] __attribute((used)) = { 1 }; + +unsigned int foo __attribute__((section(".foo"))); +extern char __foo_start; +extern char __foo_end; + +int +main (void) +{ + if (&__foo_end - &__foo_start != sizeof(foo)) + return 1; + if (!ptr_equal(&__foo_start, (char *)&foo)) + return 2; + return 0; +} diff --git a/gold/testsuite/script_test_11b.c b/gold/testsuite/script_test_11b.c new file mode 100644 index 00000000000..9f95e13bb98 --- /dev/null +++ b/gold/testsuite/script_test_11b.c @@ -0,0 +1,7 @@ +#include "script_test_11.h" + +int +ptr_equal(char *a, char *b) +{ + return a == b; +} diff --git a/gold/testsuite/script_test_1a.cc b/gold/testsuite/script_test_1a.cc new file mode 100644 index 00000000000..648b42a2dad --- /dev/null +++ b/gold/testsuite/script_test_1a.cc @@ -0,0 +1,46 @@ +// script_test_1a.cc -- linker script test 1 for gold -*- C++ -*- + +// Copyright (C) 2008-2015 Free Software Foundation, Inc. +// Written by Ian Lance Taylor . + +// This file is part of gold. + +// This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +// A test for a linker script which sets symbols to values. + +#include "script_test_1.h" + +extern char a, b, c, d, e, f, g; +int sym = 3; +int common_sym; + +int +main(int, char**) +{ + check_int(reinterpret_cast(&a), 123); + check_int(reinterpret_cast(&b), + reinterpret_cast(&a) * 2); + check_int(reinterpret_cast(&c), + reinterpret_cast(&b) + 3 * 6); + check_int(reinterpret_cast(&d), + (reinterpret_cast(&b) + 3) * 6); + check_ptr(reinterpret_cast(&e), &sym); + check_int(reinterpret_cast(&f), + reinterpret_cast(&sym) + 10); + check_ptr(reinterpret_cast(&g), &common_sym); + return 0; +} diff --git a/gold/testsuite/script_test_1b.cc b/gold/testsuite/script_test_1b.cc new file mode 100644 index 00000000000..553ebca3887 --- /dev/null +++ b/gold/testsuite/script_test_1b.cc @@ -0,0 +1,38 @@ +// script_test_1b.cc -- linker script test 1 for gold -*- C++ -*- + +// Copyright (C) 2015 Free Software Foundation, Inc. + +// This file is part of gold. + +// This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +// A test for a linker script which sets symbols to values. + +#include + +#include "script_test_1.h" + +void +check_int(intptr_t i, intptr_t j) +{ + assert (i == j); +} + +void +check_ptr(int *i, int *j) +{ + assert (i == j); +}