PATCH: Remember the symbol size if it isn't undefined

Sergei Poselenov sposelenov@emcraft.com
Thu Jan 4 14:11:00 GMT 2007
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 ();
> +}
> 



More information about the Binutils mailing list