PATCH: Remember the symbol size if it isn't undefined
Sergei Poselenov
sposelenov@emcraft.com
Thu Jan 4 14:11:00 GMT 2007
More information about the Binutils mailing list
Thu Jan 4 14:11:00 GMT 2007
- Previous message (by thread): Difference between objdump and readlelf output
- Next message (by thread): PATCH: PR binutils/3826: elf_object_p can't tell freebsd object file from standard ELF object file
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi H.J., I just tried it out building the Xenomai RPM for PowerPC - works fine. Thanks! Regards, Sergei H. J. Lu wrote: > On Fri, Dec 29, 2006 at 11:01:42PM +1300, Nick Clifton wrote: > >>Hi H. J. >> >> >>>The problem is we remember the symbol size for undefined symbol and >>>later we find out its size changes. Do we really care if an undefined >>>symble changes size? >> >>I can't imagine why. >> >> >>>2006-12-28 H.J. Lu <hongjiu.lu@intel.com> >>> >>> * elflink.c (elf_link_add_object_symbols): Remember the symbol >>> size only if it is defined. >> >>Approved - but - please could you also add a testcase to check for this >>particular bug ? >> > > > The problem is symbol order sensitive: > > 16: 0000000000000000 18 FUNC GLOBAL DEFAULT UND par > 17: 000000000000030f 23 FUNC GLOBAL DEFAULT 6 __wrap_par > > With --wrap par, when linker sees par, it will lookup __wrap_par. > At this point, __wrap_par is undefined. When linker sees __wrap_par, > it notices that the size of __wrap_par has changed. > > I am checking in this patch now. > > > H.J. > ---- > bfd/ > > 2006-12-29 H.J. Lu <hongjiu.lu@intel.com> > > * elflink.c (elf_link_add_object_symbols): Remember the symbol > size only if it is defined. > > ld/testsuite/ > > 2006-12-29 H.J. Lu <hongjiu.lu@intel.com> > > * ld-elf/wrap.exp: New file. > * ld-elf/wrap1.c: Likewise. > * ld-elf/wrap1.out: Likewise. > * ld-elf/wrap1a.c: Likewise. > * ld-elf/wrap1b.c: Likewise. > > --- binutils/bfd/elflink.c.wrap 2006-12-28 17:31:36.000000000 -0800 > +++ binutils/bfd/elflink.c 2006-12-29 09:39:28.000000000 -0800 > @@ -4058,11 +4058,13 @@ elf_link_add_object_symbols (bfd *abfd, > } > } > > - /* Remember the symbol size and type. */ > - if (isym->st_size != 0 > + /* Remember the symbol size if it isn't undefined. */ > + if ((isym->st_size != 0 && isym->st_shndx != SHN_UNDEF) > && (definition || h->size == 0)) > { > - if (h->size != 0 && h->size != isym->st_size && ! size_change_ok) > + if (h->size != 0 > + && h->size != isym->st_size > + && ! size_change_ok) > (*_bfd_error_handler) > (_("Warning: size of symbol `%s' changed" > " from %lu in %B to %lu in %B"), > --- binutils/ld/testsuite/ld-elf/wrap.exp.wrap 2006-12-29 09:39:20.000000000 -0800 > +++ binutils/ld/testsuite/ld-elf/wrap.exp 2006-12-29 09:38:00.000000000 -0800 > @@ -0,0 +1,54 @@ > +# Expect script for wrap ELF tests. > +# Copyright 2006 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. > +# > + > +# Exclude non-ELF targets. > + > +if ![is_elf_format] { > + return > +} > + > +# The following tests require running the executable generated by ld. > +if ![isnative] { > + return > +} > + > +# Check if compiler works > +if { [which $CC] == 0 } { > + return > +} > + > +set build_tests { > + {"Build libwrap1a.so" > + "-shared" "-fPIC" > + {wrap1a.c} {} "libwrap1a.so"} > + {"Build libwrap1b.so" > + "-shared tmpdir/libwrap1a.so" "-fPIC" > + {wrap1b.c} {} "libwrap1b.so"} > +} > + > +set run_tests { > + {"Run with libwrap1a.so and libwrap1b.so" > + "--wrap par tmpdir/libwrap1a.so tmpdir/libwrap1b.so" "" > + {wrap1.c} "wrap1" "wrap1.out"} > + {"Run with libwrap1b.so and libwrap1a.so" > + "--wrap par tmpdir/libwrap1b.so tmpdir/libwrap1a.so" "" > + {wrap1.c} "wrap1" "wrap1.out"} > +} > + > +run_cc_link_tests $build_tests > +run_ld_link_exec_tests [] $run_tests > --- binutils/ld/testsuite/ld-elf/wrap1.c.wrap 2006-12-29 09:39:20.000000000 -0800 > +++ binutils/ld/testsuite/ld-elf/wrap1.c 2006-12-29 09:34:38.000000000 -0800 > @@ -0,0 +1,8 @@ > +extern void par (void); > + > +int > +main (void) > +{ > + par (); > + return 0; > +} > --- binutils/ld/testsuite/ld-elf/wrap1.out.wrap 2006-12-29 09:39:20.000000000 -0800 > +++ binutils/ld/testsuite/ld-elf/wrap1.out 2006-12-29 09:34:25.000000000 -0800 > @@ -0,0 +1,3 @@ > +__wrap_par > +__real_par > +par > --- binutils/ld/testsuite/ld-elf/wrap1a.c.wrap 2006-12-29 09:39:20.000000000 -0800 > +++ binutils/ld/testsuite/ld-elf/wrap1a.c 2006-12-29 09:35:13.000000000 -0800 > @@ -0,0 +1,6 @@ > +#include <stdio.h> > + > +void par (void) > +{ > + printf ("par\n"); > +} > --- binutils/ld/testsuite/ld-elf/wrap1b.c.wrap 2006-12-29 09:39:20.000000000 -0800 > +++ binutils/ld/testsuite/ld-elf/wrap1b.c 2006-12-29 09:35:02.000000000 -0800 > @@ -0,0 +1,16 @@ > +#include <stdio.h> > + > +extern void par (void); > + > +void __real_par (void) > +{ > + printf ("__real_par \n"); > + par (); > +} > + > +void > +__wrap_par (void) > +{ > + printf ("__wrap_par \n"); > + __real_par (); > +} >
- Previous message (by thread): Difference between objdump and readlelf output
- Next message (by thread): PATCH: PR binutils/3826: elf_object_p can't tell freebsd object file from standard ELF object file
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list