This is the mail archive of the gas2@sourceware.cygnus.com mailing list for the gas2 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

A patch for ld bug.


I am enclosing a patch for the bug below. Does that look right? BTW,
if is correct for x86, should other archs be fixed also?

Thanks.

Index: elf32-i386.c
===================================================================
RCS file: /home/cvs/gnu/binutils/bfd/elf32-i386.c,v
retrieving revision 1.9
diff -c -r1.9 elf32-i386.c
*** elf32-i386.c	1996/01/19 06:22:23	1.9
--- elf32-i386.c	1996/01/28 18:25:41
***************
*** 559,569 ****
       real definition first, and we can just use the same value.  */
    if (h->weakdef != NULL)
      {
        BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
  		  || h->weakdef->root.type == bfd_link_hash_defweak);
!       h->root.u.def.section = h->weakdef->root.u.def.section;
!       h->root.u.def.value = h->weakdef->root.u.def.value;
!       return true;
      }
  
    /* This is a reference to a symbol defined by a dynamic object which
--- 559,580 ----
       real definition first, and we can just use the same value.  */
    if (h->weakdef != NULL)
      {
+       struct elf_link_hash_entry *realdef;
+ 
        BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
  		  || h->weakdef->root.type == bfd_link_hash_defweak);
! 
!       /* We need to find a real defined symbol. H.J. */
!       for (realdef = h->weakdef;
! 	realdef->weakdef && realdef != h; realdef = realdef->weakdef);
! 
!       /* We find a real definition. H.J. */
!       if (realdef->weakdef == NULL)
!       {
! 	h->root.u.def.section = h->weakdef->root.u.def.section;
! 	h->root.u.def.value = h->weakdef->root.u.def.value;
! 	return true;
!       }
      }
  
    /* This is a reference to a symbol defined by a dynamic object which
***************
*** 627,632 ****
--- 638,658 ----
  
    /* Increment the section size to make room for the symbol.  */
    s->_raw_size += h->size;
+ 
+   /* We just adjust a weak symbol. We need to check all the
+    * aliases. H.J. */
+   if (h->weakdef != NULL)
+     {
+       struct elf_link_hash_entry *realdef;
+ 
+       /* We need to find a real defined symbol. H.J. */
+       for (realdef = h->weakdef;
+ 	realdef != h; realdef = realdef->weakdef)
+       {
+ 	realdef->root.u.def.section = h->root.u.def.section;
+ 	realdef->root.u.def.value = h->root.u.def.value;
+       }
+     }
  
    return true;
  }
-- 
H.J. Lu (hjl@gnu.ai.mit.edu)
----
#!/bin/sh
# This is a shell archive (produced by GNU sharutils 4.1).
# To extract the files from this archive, save it to some FILE, remove
# everything before the `!/bin/sh' line above, then type `sh FILE'.
#
# Made on 1996-01-28 10:30 PST by <hjl@didi>.
# Source directory was `/home/hjl/bugs/ld/weak2'.
#
# Existing files will *not* be overwritten unless `-c' is specified.
#
# This shar contains:
# length mode       name
# ------ ---------- ------------------------------------------
#    207 -rw-r--r-- Makefile
#    778 -rw------- bug.log
#    132 -rw-r--r-- foo.c
#    147 -rw-r--r-- main.c
#
touch -am 1231235999 $$.touch >/dev/null 2>&1
if test ! -f 1231235999 && test -f $$.touch; then
  shar_touch=touch
else
  shar_touch=:
  echo
  echo 'WARNING: not restoring timestamps.  Consider getting and'
  echo "installing GNU \`touch', distributed in GNU File Utilities..."
  echo
fi
rm -f 1231235999 $$.touch
#
# ============= Makefile ==============
if test -f 'Makefile' && test X"$1" != X"-c"; then
  echo 'x - skipping Makefile (file already exists)'
else
  echo 'x - extracting Makefile (text)'
  sed 's/^X//' << 'SHAR_EOF' > 'Makefile' &&
all: foo
X
libfoo.so: foo.o
X	$(CC) -shared -o $@ foo.o
X
foo.o: foo.c
X	$(CC) $(CFLAGS) -fPIC -c $?
X
foo: libfoo.so main.o
X	$(CC) -o $@ main.o -L. -lfoo
X	LD_LIBRARY_PATH=. foo
X
clean:
X	-rm -rf *.o *.so foo bar
SHAR_EOF
  $shar_touch -am 0128092196 'Makefile' &&
  chmod 0644 'Makefile' ||
  echo 'restore of Makefile failed'
  shar_count="`wc -c < 'Makefile'`"
  test 207 -eq "$shar_count" ||
    echo "Makefile: original size 207, current size $shar_count"
fi
# ============= bug.log ==============
if test -f 'bug.log' && test X"$1" != X"-c"; then
  echo 'x - skipping bug.log (file already exists)'
else
  echo 'x - extracting bug.log (binary)'
  sed 's/^X//' << 'SHAR_EOF' | uudecode &&
begin 600 bug.log
M4F5A9&EN9R!S<&5C<R!F<F]M("]U<W(O;&EB+V=C8RUL:6(O:30X-BUL:6YU
M>"\R+C<N,BTY-C`Q,C8O<W!E8W,*9V-C(&1R:79E<B!V97)S:6]N(#(N-RXR
M('-N87!S:&]T(#DV,#$R-B!E>&5C=71I;F<@9V-C('9E<G-I;VX@,BXW+C(*
M("]U<W(O:30X-BUL:6YU>"]B:6XO;&0@+6T@96QF7VDS.#8@+61Y;F%M:6,M
M;&EN:V5R("]L:6(O;&0M;&EN=7@N<V\N,2`M;R!F;V\@+W5S<B]L:6(O8W)T
M,2YO("]U<W(O;&EB+V-R=&DN;R`O=7-R+VQI8B]G8V,M;&EB+VDT.#8M;&EN
M=7@O,BXW+C(M.38P,3(V+V-R=&)E9VEN+F\@+4PN("U,+W5S<B]L:6(O9V-C
M+6QI8B]I-#@V+6QI;G5X+S(N-RXR+3DV,#$R-B`M3"]U<W(O:30X-BUL:6YU
M>"]L:6(@;6%I;BYO("UL9F]O("UL9V-C("UL8R`M;&=C8R`O=7-R+VQI8B]G
M8V,M;&EB+VDT.#8M;&EN=7@O,BXW+C(M.38P,3(V+V-R=&5N9"YO("]U<W(O
M;&EB+V-R=&XN;PIC8R`@+69024,@+6,@9F]O+F,*9F]O+F,Z,3`Z('=A<FYI
M;F<Z(&EN:71I86QI>F%T:6]N(&UA:V5S('!O:6YT97(@9G)O;2!I;G1E9V5R
M('=I=&AO=70@82!C87-T"B]T;7`O8V-A,#4Q-#0N<SH@07-S96UB;&5R(&UE
M<W-A9V5S.@HO=&UP+V-C83`U,30T+G,Z,3,Z(%=A<FYI;F<Z(%]?9F]O(&%L
M<F5A9'D@9&5C;&%R960@87,@9VQO8F%L"F-C("US:&%R960@+6\@;&EB9F]O
M+G-O(&9O;RYO"F-C("`@("UC(&UA:6XN8R`M;R!M86EN+F\*8V,@+6\@9F]O
M(&UA:6XN;R`M3"X@+6QF;V\*3$1?3$E"4D%265]0051(/2X@9F]O"E]?9F]O
-.B`V-`IF;V\Z(#8T"FQF
`
end
SHAR_EOF
  $shar_touch -am 0128103096 'bug.log' &&
  chmod 0600 'bug.log' ||
  echo 'restore of bug.log failed'
  shar_count="`wc -c < 'bug.log'`"
  test 778 -eq "$shar_count" ||
    echo "bug.log: original size 778, current size $shar_count"
fi
# ============= foo.c ==============
if test -f 'foo.c' && test X"$1" != X"-c"; then
  echo 'x - skipping foo.c (file already exists)'
else
  echo 'x - extracting foo.c (text)'
  sed 's/^X//' << 'SHAR_EOF' > 'foo.c' &&
#pragma weak __foo
X
#if 1
#pragma weak foo = __foo
#else
#include <gnu-stabs.h>
elf_alias (__foo, foo);
#endif
X
char **__foo = 100;
SHAR_EOF
  $shar_touch -am 0128102996 'foo.c' &&
  chmod 0644 'foo.c' ||
  echo 'restore of foo.c failed'
  shar_count="`wc -c < 'foo.c'`"
  test 132 -eq "$shar_count" ||
    echo "foo.c: original size 132, current size $shar_count"
fi
# ============= main.c ==============
if test -f 'main.c' && test X"$1" != X"-c"; then
  echo 'x - skipping main.c (file already exists)'
else
  echo 'x - extracting main.c (text)'
  sed 's/^X//' << 'SHAR_EOF' > 'main.c' &&
#include <stdio.h>
X
extern char **__foo;
extern char **foo;
main ()
{
X  printf ("__foo: %x\n", __foo);
X  printf ("foo: %x\n", foo);
X
X  return 0;
}
SHAR_EOF
  $shar_touch -am 0128102896 'main.c' &&
  chmod 0644 'main.c' ||
  echo 'restore of main.c failed'
  shar_count="`wc -c < 'main.c'`"
  test 147 -eq "$shar_count" ||
    echo "main.c: original size 147, current size $shar_count"
fi
exit 0