Imported Upstream version 20130503 upstream upstream/20130503
authorChanho Park <chanho61.park@samsung.com>
Sat, 15 Nov 2014 16:09:50 +0000 (01:09 +0900)
committerChanho Park <chanho61.park@samsung.com>
Sat, 15 Nov 2014 16:09:50 +0000 (01:09 +0900)
52 files changed:
ChangeLog
src/arch-s390.c
src/arch-s390x.c
src/cache.c
src/dwarf2.c
src/dwarf2.h
src/get.c
src/prelink.h
testsuite/Makefile.am
testsuite/Makefile.in
testsuite/cxx1.sh
testsuite/cxx2.sh
testsuite/cxx3.sh
testsuite/deps1.sh
testsuite/deps2.sh
testsuite/ifunc.h
testsuite/ifunc1.sh
testsuite/ifunc2.sh
testsuite/ifunc3.sh
testsuite/quick1.sh
testsuite/quick2.sh
testsuite/quick3.sh
testsuite/reloc1.sh
testsuite/reloc10.sh
testsuite/reloc11.sh
testsuite/reloc3.sh
testsuite/reloc4.sh
testsuite/reloc5.sh
testsuite/reloc6.sh
testsuite/reloc7.sh
testsuite/reloc8.sh
testsuite/reloc9.sh
testsuite/shuffle1.sh
testsuite/shuffle2.sh
testsuite/shuffle3.sh
testsuite/shuffle4.sh
testsuite/shuffle5.sh
testsuite/shuffle6.sh
testsuite/shuffle7.sh
testsuite/shuffle8.sh
testsuite/shuffle9.sh
testsuite/tls1.sh
testsuite/tls2.sh
testsuite/tls3.sh
testsuite/tls4.sh
testsuite/tls5.sh
testsuite/tls6.sh
testsuite/undo1.sh
testsuite/unprel1.c [new file with mode: 0644]
testsuite/unprel1.sh [new file with mode: 0755]
testsuite/unprel1lib1.c [new file with mode: 0644]
testsuite/unprel1lib2.c [new file with mode: 0644]

index 2ab86ce..970a70c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,94 @@
+2013-05-03  Jakub Jelinek  <jakub@redhat.com>
+
+       * src/cache.c (prelink_save_cache_check): For ET_CACHE_DYN
+       or ET_UNPRELINKABLE dependencies, call prelink_save_cache_check
+       recursively.
+       * testsuite/Makefile.am (TESTS): Add unprel1.sh.
+       * testsuite/Makefile.in: Regenerated.
+       * testsuite/unprel1.sh: New test.
+       * testsuite/unprel1.c: New file.
+       * testsuite/unprel1lib1.c: New file.
+       * testsuite/unprel1lib2.c: New file.
+
+       * src/prelink.h (R_390_IRELATIVE): Define if not defined.
+
+2013-04-25  Jakub Jelinek  <jakub@redhat.com>
+
+       * src/arch-s390.c (s390_adjust_rela, s390_prelink_rela,
+       s390_apply_conflict_rela, s390_prelink_conflict_rela,
+       s390_undo_prelink_rela): Handle R_390_IRELATIVE.
+       * src/arch-s390x.c (s390x_adjust_rela, s390x_prelink_rela,
+       s390x_apply_conflict_rela, s390x_prelink_conflict_rela,
+       s390x_undo_prelink_rela, s390x_reloc_size): Likewise.
+
+2013-04-18  Jakub Jelinek  <jakub@redhat.com>
+
+       * testsuite/reloc4.sh: Add libraries to link lines to make
+       testsuite work both with --no-add-needed and with --add-needed,
+       including latest ld.bfd.
+       * testsuite/reloc5.sh: Likewise.
+       * testsuite/reloc8.sh: Likewise.
+       * testsuite/reloc9.sh: Likewise.
+
+2013-04-17  Jakub Jelinek  <jakub@redhat.com>
+
+       * testsuite/ifunc.h (IFUNC_DECL): Fix up .size on ppc64.
+       * testsuite/cxx1.sh: Add libraries to link lines to make
+       testsuite work both with --no-add-needed and with --add-needed,
+       including latest ld.bfd.
+       * testsuite/cxx2.sh: Likewise.
+       * testsuite/cxx3.sh: Likewise.
+       * testsuite/deps1.sh: Likewise.
+       * testsuite/deps2.sh: Likewise.
+       * testsuite/ifunc1.sh: Likewise.
+       * testsuite/ifunc2.sh: Likewise.
+       * testsuite/ifunc3.sh: Likewise.
+       * testsuite/quick1.sh: Likewise.
+       * testsuite/quick2.sh: Likewise.
+       * testsuite/quick3.sh: Likewise.
+       * testsuite/reloc1.sh: Likewise.
+       * testsuite/reloc10.sh: Likewise.
+       * testsuite/reloc11.sh: Likewise.
+       * testsuite/reloc3.sh: Likewise.
+       * testsuite/reloc6.sh: Likewise.
+       * testsuite/reloc7.sh: Likewise.
+       * testsuite/shuffle1.sh: Likewise.
+       * testsuite/shuffle2.sh: Likewise.
+       * testsuite/shuffle3.sh: Likewise.
+       * testsuite/shuffle4.sh: Likewise.
+       * testsuite/shuffle5.sh: Likewise.
+       * testsuite/shuffle6.sh: Likewise.
+       * testsuite/shuffle7.sh: Likewise.
+       * testsuite/shuffle8.sh: Likewise.
+       * testsuite/shuffle9.sh: Likewise.
+       * testsuite/tls1.sh: Likewise.
+       * testsuite/tls2.sh: Likewise.
+       * testsuite/tls3.sh: Likewise.
+       * testsuite/tls4.sh: Likewise.
+       * testsuite/tls5.sh: Likewise.
+       * testsuite/tls6.sh: Likewise.
+       * testsuite/undo1.sh: Likewise.
+
+2012-06-28  Jakub Jelinek  <jakub@redhat.com>
+
+       * src/get.c (is_ldso_soname): Add arm dynamic linker SONAMEs.
+
+       * src/dwarf2.h (DW_FORM_GNU_ref_alt,
+       DW_FORM_GNU_strp_alt): Define.
+       * src/dwarf2.c (read_abbrev): Allow those forms.
+       (adjust_attributes): Handle them.
+
+2012-04-10  Jakub Jelinek  <jakub@redhat.com>
+
+       * src/dwarf2.c (DEBUG_MACRO): Define.
+       (debug_sections): Add .debug_macro entry.
+
+2012-04-02  Jakub Jelinek  <jakub@redhat.com>
+
+       * src/dwarf2.c (adjust_attributes): For DWARF4+ treat
+       DW_AT_data_member_location with DW_FORM_data[48] as
+       large constant instead of loclistptr.
+
 2011-10-12  Jakub Jelinek  <jakub@redhat.com>
 
        * src/main.c (layout_page_size): New variable.
index 829392e..16eb9d7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003, 2004, 2009, 2010 Red Hat, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2004, 2009, 2010, 2013 Red Hat, Inc.
    Written by Jakub Jelinek <jakub@redhat.com>, 2001.
 
    This program is free software; you can redistribute it and/or modify
@@ -90,7 +90,13 @@ s390_adjust_rela (DSO *dso, GElf_Rela *rela, GElf_Addr start,
          rela->r_addend += (Elf32_Sword) adjust;
        }
       break;
+    case R_390_IRELATIVE:
+      if (rela->r_addend >= start)
+       /* Adjust the resolver function address.  */
+       rela->r_addend += adjust;
+      /* FALLTHROUGH */
     case R_390_JMP_SLOT:
+      /* Adjust the address in the GOT slot.  */
       addr = read_ube32 (dso, rela->r_offset);
       if (addr >= start)
        write_be32 (dso, rela->r_offset, addr + adjust);
@@ -113,7 +119,8 @@ s390_prelink_rela (struct prelink_info *info, GElf_Rela *rela,
   DSO *dso = info->dso;
   GElf_Addr value;
 
-  if (GELF_R_TYPE (rela->r_info) == R_390_NONE)
+  if (GELF_R_TYPE (rela->r_info) == R_390_NONE
+      || GELF_R_TYPE (rela->r_info) == R_390_IRELATIVE)
     return 0;
   else if (GELF_R_TYPE (rela->r_info) == R_390_RELATIVE)
     {
@@ -190,6 +197,7 @@ static int
 s390_apply_conflict_rela (struct prelink_info *info, GElf_Rela *rela,
                          char *buf, GElf_Addr dest_addr)
 {
+  GElf_Rela *ret;
   switch (GELF_R_TYPE (rela->r_info))
     {
     case R_390_32:
@@ -201,6 +209,16 @@ s390_apply_conflict_rela (struct prelink_info *info, GElf_Rela *rela,
     case R_390_8:
       buf_write_8 (buf, rela->r_addend);
       break;
+    case R_390_IRELATIVE:
+      if (dest_addr == 0)
+       return 5;
+      ret = prelink_conflict_add_rela (info);
+      if (ret == NULL)
+       return 1;
+      ret->r_offset = dest_addr;
+      ret->r_info = GELF_R_INFO (0, R_390_IRELATIVE);
+      ret->r_addend = rela->r_addend;
+      break;
     default:
       abort ();
     }
@@ -297,18 +315,14 @@ s390_prelink_conflict_rela (DSO *dso, struct prelink_info *info,
        /* Even local DTPMOD and TPOFF relocs need conflicts.  */
        case R_390_TLS_DTPMOD:
        case R_390_TLS_TPOFF:
+       /* IRELATIVE always need conflicts.  */
+       case R_390_IRELATIVE:
          break;
        default:
          return 0;
        }
       value = 0;
     }
-  else if (conflict->ifunc)
-    {
-      error (0, 0, "%s: STT_GNU_IFUNC not handled on S390 yet",
-            dso->filename);
-      return 1;
-    }
   else
     {
       /* DTPOFF wants to see only real conflicts, not lookups
@@ -331,9 +345,14 @@ s390_prelink_conflict_rela (DSO *dso, struct prelink_info *info,
     case R_390_GLOB_DAT:
     case R_390_JMP_SLOT:
       ret->r_addend = (Elf32_Sword) (value - rela->r_addend);
+      if (conflict != NULL && conflict->ifunc)
+       ret->r_info = GELF_R_INFO (0, R_390_IRELATIVE);
       break;
     case R_390_32:
+    case R_390_IRELATIVE:
       ret->r_addend = (Elf32_Sword) value;
+      if (conflict != NULL && conflict->ifunc)
+       ret->r_info = GELF_R_INFO (0, R_390_IRELATIVE);
       break;
     case R_390_PC32:
       ret->r_addend = (Elf32_Sword) (value - rela->r_offset);
@@ -481,6 +500,7 @@ s390_undo_prelink_rela (DSO *dso, GElf_Rela *rela, GElf_Addr relaaddr)
     {
     case R_390_NONE:
     case R_390_RELATIVE:
+    case R_390_IRELATIVE:
       break;
     case R_390_JMP_SLOT:
       sec = addr_to_sec (dso, rela->r_offset);
index a0321ef..ba098f4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003, 2004, 2009 Red Hat, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2004, 2009, 2013 Red Hat, Inc.
    Written by Jakub Jelinek <jakub@redhat.com>, 2001.
 
    This program is free software; you can redistribute it and/or modify
@@ -90,7 +90,13 @@ s390x_adjust_rela (DSO *dso, GElf_Rela *rela, GElf_Addr start,
          rela->r_addend += adjust;
        }
       break;
+    case R_390_IRELATIVE:
+      if (rela->r_addend >= start)
+       /* Adjust the resolver function address.  */
+       rela->r_addend += adjust;
+      /* FALLTHROUGH */
     case R_390_JMP_SLOT:
+      /* Adjust the address in the GOT slot.  */
       addr = read_ube64 (dso, rela->r_offset);
       if (addr >= start)
        write_be64 (dso, rela->r_offset, addr + adjust);
@@ -113,7 +119,8 @@ s390x_prelink_rela (struct prelink_info *info, GElf_Rela *rela,
   DSO *dso = info->dso;
   GElf_Addr value;
 
-  if (GELF_R_TYPE (rela->r_info) == R_390_NONE)
+  if (GELF_R_TYPE (rela->r_info) == R_390_NONE
+      || GELF_R_TYPE (rela->r_info) == R_390_IRELATIVE)
     return 0;
   else if (GELF_R_TYPE (rela->r_info) == R_390_RELATIVE)
     {
@@ -193,6 +200,7 @@ static int
 s390x_apply_conflict_rela (struct prelink_info *info, GElf_Rela *rela,
                           char *buf, GElf_Addr dest_addr)
 {
+  GElf_Rela *ret;
   switch (GELF_R_TYPE (rela->r_info))
     {
     case R_390_64:
@@ -207,6 +215,16 @@ s390x_apply_conflict_rela (struct prelink_info *info, GElf_Rela *rela,
     case R_390_8:
       buf_write_8 (buf, rela->r_addend);
       break;
+    case R_390_IRELATIVE:
+      if (dest_addr == 0)
+       return 5;
+      ret = prelink_conflict_add_rela (info);
+      if (ret == NULL)
+       return 1;
+      ret->r_offset = dest_addr;
+      ret->r_info = GELF_R_INFO (0, R_390_IRELATIVE);
+      ret->r_addend = rela->r_addend;
+      break;
     default:
       abort ();
     }
@@ -308,18 +326,14 @@ s390x_prelink_conflict_rela (DSO *dso, struct prelink_info *info,
        /* Even local DTPMOD and TPOFF relocs need conflicts.  */
        case R_390_TLS_DTPMOD:
        case R_390_TLS_TPOFF:
+       /* IRELATIVE always need conflicts.  */
+       case R_390_IRELATIVE:
          break;
        default:
          return 0;
        }
       value = 0;
     }
-  else if (conflict->ifunc)
-    {
-      error (0, 0, "%s: STT_GNU_IFUNC not handled on S390x yet",
-            dso->filename);
-      return 1;
-    }
   else
     {
       /* DTPOFF wants to see only real conflicts, not lookups
@@ -344,8 +358,12 @@ s390x_prelink_conflict_rela (DSO *dso, struct prelink_info *info,
     case R_390_GLOB_DAT:
     case R_390_JMP_SLOT:
     case R_390_64:
+    case R_390_IRELATIVE:
       ret->r_addend = value;
-      r_type = R_390_64;
+      if (conflict != NULL && conflict->ifunc)
+       r_type = R_390_IRELATIVE;
+      else
+       r_type = R_390_64;
       break;
     case R_390_PC32:
       value -= rela->r_offset;
@@ -498,6 +516,7 @@ s390x_undo_prelink_rela (DSO *dso, GElf_Rela *rela, GElf_Addr relaaddr)
     {
     case R_390_NONE:
     case R_390_RELATIVE:
+    case R_390_IRELATIVE:
       break;
     case R_390_JMP_SLOT:
       sec = addr_to_sec (dso, rela->r_offset);
@@ -565,6 +584,7 @@ s390x_reloc_size (int reloc_type)
     case R_390_JMP_SLOT:
     case R_390_64:
     case R_390_PC64:
+    case R_390_IRELATIVE:
       return 8;
     case R_390_32:
     case R_390_PC32:
index b677e22..8136c10 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003, 2004, 2006 Red Hat, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2004, 2006, 2013 Red Hat, Inc.
    Written by Jakub Jelinek <jakub@redhat.com>, 2001.
 
    This program is free software; you can redistribute it and/or modify
@@ -566,10 +566,14 @@ prelink_save_cache_check (struct prelink_entry *ent)
          return 1;
        break;
       case ET_CACHE_DYN:
+       if (prelink_save_cache_check (ent->depends[i]))
+         return 1;
        break;
       case ET_UNPRELINKABLE:
        if (ent->type != ET_UNPRELINKABLE)
          return 1;
+       if (prelink_save_cache_check (ent->depends[i]))
+         return 1;
        break;
       default:
        return 1;
index 2da3d4f..a8002e7 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 2001, 2002, 2003, 2005, 2006, 2009, 2010, 2011 Red Hat, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2005, 2006, 2009, 2010, 2011, 2012
+   Red Hat, Inc.
    Written by Jakub Jelinek <jakub@redhat.com>, 2001.
 
    This program is free software; you can redistribute it and/or modify
@@ -162,6 +163,7 @@ static struct
 #define DEBUG_FRAME    9
 #define DEBUG_RANGES   10
 #define DEBUG_TYPES    11
+#define DEBUG_MACRO    12
     { ".debug_info", NULL, 0, 0 },
     { ".debug_abbrev", NULL, 0, 0 },
     { ".debug_line", NULL, 0, 0 },
@@ -174,6 +176,7 @@ static struct
     { ".debug_frame", NULL, 0, 0 },
     { ".debug_ranges", NULL, 0, 0 },
     { ".debug_types", NULL, 0, 0 },
+    { ".debug_macro", NULL, 0, 0 },
     { NULL, NULL, 0 }
   };
 
@@ -274,7 +277,10 @@ no_memory:
            }
          form = read_uleb128 (ptr);
          if (form == 2
-             || (form > DW_FORM_flag_present && form != DW_FORM_ref_sig8))
+             || (form > DW_FORM_flag_present
+                 && form != DW_FORM_ref_sig8
+                 && form != DW_FORM_GNU_ref_alt
+                 && form != DW_FORM_GNU_strp_alt))
            {
              error (0, 0, "%s: Unknown DWARF DW_FORM_%d", dso->filename, form);
              htab_delete (h);
@@ -586,10 +592,16 @@ adjust_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t,
        {
          switch (t->attr[i].attr)
            {
+           case DW_AT_data_member_location:
+             /* In DWARF4+ DW_AT_data_member_location
+                with DW_FORM_data[48] is just very high
+                constant, rather than loclistptr.  */
+             if (cu->cu_version >= 4 && form != DW_FORM_sec_offset)
+               break;
+             /* FALLTHRU */
            case DW_AT_location:
            case DW_AT_string_length:
            case DW_AT_return_addr:
-           case DW_AT_data_member_location:
            case DW_AT_frame_base:
            case DW_AT_segment:
            case DW_AT_static_link:
@@ -653,6 +665,7 @@ adjust_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t,
              ptr += 2;
              break;
            case DW_FORM_ref4:
+           case DW_FORM_GNU_ref_alt:
            case DW_FORM_data4:
            case DW_FORM_sec_offset:
              ptr += 4;
@@ -674,6 +687,7 @@ adjust_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t,
                ptr += 4;
              break;
            case DW_FORM_strp:
+           case DW_FORM_GNU_strp_alt:
              ptr += 4;
              break;
            case DW_FORM_string:
index 97864fb..b0c80b6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2009, 2010, 2011 Red Hat, Inc.
+/* Copyright (C) 2001, 2002, 2009, 2010, 2011, 2012 Red Hat, Inc.
    Written by Jakub Jelinek <jakub@redhat.com>, 2001.
 
    This program is free software; you can redistribute it and/or modify
 #define DW_FORM_exprloc                        0x18
 #define DW_FORM_flag_present           0x19
 #define DW_FORM_ref_sig8               0x20
+#define DW_FORM_GNU_ref_alt            0x1f20
+#define DW_FORM_GNU_strp_alt           0x1f21
 
 #define DW_AT_sibling                  0x01
 #define DW_AT_location                 0x02
index fe32deb..43072f8 100644 (file)
--- a/src/get.c
+++ b/src/get.c
@@ -33,7 +33,9 @@ is_ldso_soname (const char *soname)
       || ! strcmp (soname, "ld.so.1")
       || ! strcmp (soname, "ld-linux-ia64.so.2")
       || ! strcmp (soname, "ld-linux-x86-64.so.2")
-      || ! strcmp (soname, "ld64.so.1"))
+      || ! strcmp (soname, "ld64.so.1")
+      || ! strcmp (soname, "ld-linux.so.3")
+      || ! strcmp (soname, "ld-linux-armhf.so.3"))
     return 1;
   return 0;
 }
index c223d4b..b1836f9 100644 (file)
@@ -1,5 +1,5 @@
-/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011
-   Red Hat, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011,
+   2013 Red Hat, Inc.
    Written by Jakub Jelinek <jakub@redhat.com>, 2001.
 
    This program is free software; you can redistribute it and/or modify
 #define R_PPC64_IRELATIVE      248
 #endif
 
+#ifndef R_390_IRELATIVE
+#define R_390_IRELATIVE                61
+#endif
+
 struct prelink_entry;
 struct prelink_info;
 struct PLArch;
index 046c55f..b80eb48 100644 (file)
@@ -10,7 +10,7 @@ TESTS = movelibs.sh \
        reloc7.sh reloc8.sh reloc9.sh reloc10.sh reloc11.sh \
        shuffle1.sh shuffle2.sh shuffle3.sh shuffle4.sh shuffle5.sh \
        shuffle6.sh shuffle7.sh shuffle8.sh shuffle9.sh undo1.sh \
-       layout1.sh layout2.sh \
+       layout1.sh layout2.sh unprel1.sh \
        tls1.sh tls2.sh tls3.sh tls4.sh tls5.sh tls6.sh tls7.sh \
        cxx1.sh cxx2.sh cxx3.sh quick1.sh quick2.sh quick3.sh \
        cycle1.sh cycle2.sh \
index cf44b9a..84e0ea2 100644 (file)
@@ -105,7 +105,7 @@ TESTS = movelibs.sh \
        reloc7.sh reloc8.sh reloc9.sh reloc10.sh reloc11.sh \
        shuffle1.sh shuffle2.sh shuffle3.sh shuffle4.sh shuffle5.sh \
        shuffle6.sh shuffle7.sh shuffle8.sh shuffle9.sh undo1.sh \
-       layout1.sh layout2.sh \
+       layout1.sh layout2.sh unprel1.sh \
        tls1.sh tls2.sh tls3.sh tls4.sh tls5.sh tls6.sh tls7.sh \
        cxx1.sh cxx2.sh cxx3.sh quick1.sh quick2.sh quick3.sh \
        cycle1.sh cycle2.sh \
index 71ac75e..477a545 100755 (executable)
@@ -6,7 +6,7 @@ $CXX -shared -O2 -fpic -o cxx1lib1.so $srcdir/cxx1lib1.C
 $CXX -shared -O2 -fpic -o cxx1lib2.so $srcdir/cxx1lib2.C cxx1lib1.so
 BINS="cxx1"
 LIBS="cxx1lib1.so cxx1lib2.so"
-$CXXLINK -o cxx1 $srcdir/cxx1.C -Wl,--rpath-link,. cxx1lib2.so
+$CXXLINK -o cxx1 $srcdir/cxx1.C -Wl,--rpath-link,. cxx1lib2.so cxx1lib1.so
 savelibs
 echo $PRELINK -vvvv ${PRELINK_OPTS--vm} ./cxx1 > cxx1.log
 $PRELINK -vvvv ${PRELINK_OPTS--vm} ./cxx1 >> cxx1.log 2>&1 || exit 1
index 164fe11..064fcb6 100755 (executable)
@@ -6,7 +6,7 @@ $CXX -shared -O2 -fpic -o cxx2lib1.so $srcdir/cxx1lib1.C
 $CXX -shared -O2 -fpic -o cxx2lib2.so $srcdir/cxx1lib2.C cxx2lib1.so
 BINS="cxx2"
 LIBS="cxx2lib1.so cxx2lib2.so"
-$CXXLINK -o cxx2 $srcdir/cxx2.C -Wl,--rpath-link,. cxx2lib2.so
+$CXXLINK -o cxx2 $srcdir/cxx2.C -Wl,--rpath-link,. cxx2lib2.so cxx2lib1.so
 savelibs
 echo $PRELINK -vvvv ${PRELINK_OPTS--vm} ./cxx2 > cxx2.log
 $PRELINK -vvvv ${PRELINK_OPTS--vm} ./cxx2 >> cxx2.log 2>&1 || exit 1
index bc798a6..418369a 100755 (executable)
@@ -6,7 +6,7 @@ $CXX -shared -O2 -fpic -o cxx3lib1.so $srcdir/cxx3lib1.C
 $CXX -shared -O2 -fpic -o cxx3lib2.so $srcdir/cxx3lib2.C cxx3lib1.so
 BINS="cxx3"
 LIBS="cxx3lib1.so cxx3lib2.so"
-$CXXLINK -o cxx3 $srcdir/cxx3.C -Wl,--rpath-link,. cxx3lib2.so
+$CXXLINK -o cxx3 $srcdir/cxx3.C -Wl,--rpath-link,. cxx3lib2.so cxx3lib1.so
 savelibs
 echo $PRELINK -vvvv ${PRELINK_OPTS--vm} ./cxx3 > cxx3.log
 $PRELINK -vvvv ${PRELINK_OPTS--vm} ./cxx3 >> cxx3.log 2>&1 || exit 1
index c345c07..b61a41d 100755 (executable)
@@ -25,7 +25,7 @@ for lib in `cat syslnk.list`; do
   cp -dp $lib deps1.tree/lib
 done
 $CCLINK -o deps1.tree/usr/bin/bin1 $srcdir/deps1.c \
-    -Wl,-rpath,deps1.tree/usr/lib -L deps1.tree/usr/lib -l3
+    -Wl,-rpath,deps1.tree/usr/lib -L deps1.tree/usr/lib -l3 -lc -l1 -l2
 cat > deps1.tree/etc/prelink.conf <<EOF
 deps1.tree/usr/bin
 deps1.tree/lib
index 636023c..0bcc21c 100755 (executable)
@@ -25,7 +25,7 @@ for lib in `cat syslnk.list`; do
   cp -dp $lib deps2.tree/lib
 done
 $CCLINK -o deps2.tree/usr/bin/bin1 $srcdir/deps1.c \
-    -Wl,-rpath,deps2.tree/usr/lib -L deps2.tree/usr/lib -l3
+    -Wl,-rpath,deps2.tree/usr/lib -L deps2.tree/usr/lib -l3 -lc -l1 -l2
 cat > deps2.tree/etc/prelink.conf <<EOF
 deps2.tree/usr/bin
 deps2.tree/lib
index 036444b..a1894b3 100644 (file)
@@ -33,7 +33,7 @@ asm (".text\n"                                                \
      "\t.previous\n"                                   \
      ".L." #name ":\n"                                 \
      IFUNC_ASM (PICK (fn1, fn2))                       \
-     "\t.size " #name ", .-" #name "\n")
+     "\t.size " #name ", .-.L" #name "\n")
 # endif
 #else
 # error Architecture not supported
index 7746234..135014d 100755 (executable)
@@ -9,7 +9,7 @@ $CC -shared -O2 -fpic -o ifunc1lib1.so $srcdir/ifunc1lib1.c
 $CC -shared -O2 -fpic -o ifunc1lib2.so $srcdir/ifunc1lib2.c ifunc1lib1.so
 BINS="ifunc1"
 LIBS="ifunc1lib1.so ifunc1lib2.so"
-$CCLINK -o ifunc1 $srcdir/ifunc1.c -Wl,--rpath-link,. ifunc1lib2.so
+$CCLINK -o ifunc1 $srcdir/ifunc1.c -Wl,--rpath-link,. ifunc1lib2.so -lc ifunc1lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./ifunc1 >> ifunc1.log
 $PRELINK ${PRELINK_OPTS--vm} ./ifunc1 >> ifunc1.log 2>&1 || exit 1
index dea5bf4..3966e86 100755 (executable)
@@ -9,7 +9,7 @@ $CC -shared -O2 -fpic -o ifunc2lib1.so $srcdir/ifunc1lib1.c -DPICKNO=2
 $CC -shared -O2 -fpic -o ifunc2lib2.so $srcdir/ifunc1lib2.c ifunc2lib1.so -DPICKNO=2
 BINS="ifunc2"
 LIBS="ifunc2lib1.so ifunc2lib2.so"
-$CCLINK -o ifunc2 $srcdir/ifunc1.c -Wl,--rpath-link,. ifunc2lib2.so -DPICKNO=2
+$CCLINK -o ifunc2 $srcdir/ifunc1.c -Wl,--rpath-link,. ifunc2lib2.so -lc ifunc2lib1.so -DPICKNO=2
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./ifunc2 >> ifunc2.log
 $PRELINK ${PRELINK_OPTS--vm} ./ifunc2 >> ifunc2.log 2>&1 || exit 1
index a54d4ec..30fc893 100755 (executable)
@@ -9,7 +9,7 @@ $CC -shared -O2 -fpic -o ifunc3lib1.so $srcdir/ifunc3lib1.c
 $CC -shared -O2 -fpic -o ifunc3lib2.so $srcdir/ifunc1lib2.c ifunc3lib1.so
 BINS="ifunc3"
 LIBS="ifunc3lib1.so ifunc3lib2.so"
-$CCLINK -o ifunc3 $srcdir/ifunc3.c -Wl,--rpath-link,. ifunc3lib2.so
+$CCLINK -o ifunc3 $srcdir/ifunc3.c -Wl,--rpath-link,. ifunc3lib2.so -lc ifunc3lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./ifunc3 >> ifunc3.log
 $PRELINK ${PRELINK_OPTS--vm} ./ifunc3 >> ifunc3.log 2>&1 || exit 1
index 8974146..691b940 100755 (executable)
@@ -55,16 +55,16 @@ for lib in `cat syslnk.list`; do
   cp -dp $lib quick1.tree/lib
 done
 $CCLINK -o quick1.tree/usr/bin/bin1 $srcdir/reloc1.c \
-    -Wl,--rpath-link,quick1.tree/usr/lib -L quick1.tree/usr/lib -l2
+    -Wl,--rpath-link,quick1.tree/usr/lib -L quick1.tree/usr/lib -l2 -lc -l1
 echo 'int main () { extern int foo; return foo; }' \
   | $CCLINK -o quick1.tree/usr/bin/bin2 -xc - -xnone \
     -L quick1.tree/usr/lib -l4
 $CCLINK -o quick1.tree/usr/bin/bin3 $srcdir/reloc1.c \
-    -Wl,--rpath-link,quick1.tree/usr/lib -L quick1.tree/usr/lib -l7
+    -Wl,--rpath-link,quick1.tree/usr/lib -L quick1.tree/usr/lib -l7 -lc -l2 -l1
 $CCLINK -o quick1.tree/usr/bin/bin4 $srcdir/quick1.c \
-    -Wl,--rpath-link,quick1.tree/usr/lib -L quick1.tree/usr/lib -l2
+    -Wl,--rpath-link,quick1.tree/usr/lib -L quick1.tree/usr/lib -l2 -lc -l1
 $CCLINK -o quick1.tree/usr/bin/bin5 $srcdir/quick1.c \
-    -Wl,--rpath-link,quick1.tree/usr/lib -L quick1.tree/usr/lib -l7
+    -Wl,--rpath-link,quick1.tree/usr/lib -L quick1.tree/usr/lib -l7 -lc -l2 -l1
 echo 'int main () { return 0; }' \
   | $CCLINK -o quick1.tree/usr/bin/bin6 -xc - -xnone \
     -Wl,--rpath-link,quick1.tree/usr/lib -L quick1.tree/usr/lib -l6
index b999786..031a410 100755 (executable)
@@ -57,16 +57,16 @@ for lib in `cat syslnk.list`; do
   cp -dp $lib quick2.tree/lib
 done
 $CCLINK -o quick2.tree/usr/bin/bin1 $srcdir/reloc1.c \
-    -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l2
+    -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l2 -lc -l1
 echo 'int main () { extern int foo; return foo; }' \
   | $CCLINK -o quick2.tree/usr/bin/bin2 -xc - -xnone \
     -L quick2.tree/usr/lib -l4
 $CCLINK -o quick2.tree/usr/bin/bin3 $srcdir/reloc1.c \
-    -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l7
+    -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l7 -lc -l2 -l1
 $CCLINK -o quick2.tree/usr/bin/bin4 $srcdir/quick1.c \
-    -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l2
+    -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l2 -lc -l1
 $CCLINK -o quick2.tree/usr/bin/bin5 $srcdir/quick1.c \
-    -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l7
+    -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l7 -lc -l2 -l1
 echo 'int main () { return 0; }' \
   | $CCLINK -o quick2.tree/usr/bin/bin6 -xc - -xnone \
     -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l6
index 00d2aad..1cdb523 100755 (executable)
@@ -43,7 +43,7 @@ for lib in `cat syslnk.list`; do
   cp -dp $lib quick3.tree/lib
 done
 $CCLINK -o quick3.tree/usr/bin/bin1 $srcdir/reloc1.c \
-    -Wl,--rpath-link,quick3.tree/usr/lib -L quick3.tree/usr/lib -l2
+    -Wl,--rpath-link,quick3.tree/usr/lib -L quick3.tree/usr/lib -l2 -lc -l1
 cat > quick3.tree/etc/prelink.conf <<EOF
 quick3.tree/usr/bin
 quick3.tree/lib
index 124ab96..5616d4e 100755 (executable)
@@ -6,7 +6,7 @@ $CC -shared -O2 -fpic -o reloc1lib1.so $srcdir/reloc1lib1.c
 $CC -shared -O2 -fpic -o reloc1lib2.so $srcdir/reloc1lib2.c reloc1lib1.so
 BINS="reloc1"
 LIBS="reloc1lib1.so reloc1lib2.so"
-$CCLINK -o reloc1 $srcdir/reloc1.c -Wl,--rpath-link,. reloc1lib2.so
+$CCLINK -o reloc1 $srcdir/reloc1.c -Wl,--rpath-link,. reloc1lib2.so -lc reloc1lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./reloc1 > reloc1.log
 $PRELINK ${PRELINK_OPTS--vm} ./reloc1 >> reloc1.log 2>&1 || exit 1
index 94a4e69..03034c1 100755 (executable)
@@ -6,10 +6,11 @@ $CC -shared -O2 -fpic -o reloc10lib1.so $srcdir/reloc10lib1.c
 $CC -shared -O2 -nostdlib -fpic -o reloc10lib2.so $srcdir/reloc10lib2.c reloc10lib1.so
 $CC -shared -O2 -nostdlib -fpic -o reloc10lib3.so $srcdir/reloc10lib3.c reloc10lib1.so
 $CC -shared -O2 -nostdlib -fpic -o reloc10lib4.so $srcdir/reloc10lib4.c reloc10lib1.so
-$CC -shared -O2 -fpic -o reloc10lib5.so $srcdir/reloc10lib5.c reloc10lib2.so reloc10lib3.so reloc10lib4.so
+$CC -shared -O2 -fpic -o reloc10lib5.so $srcdir/reloc10lib5.c -Wl,--rpath-link,. \
+  reloc10lib2.so reloc10lib3.so reloc10lib4.so
 BINS="reloc10"
 LIBS="reloc10lib1.so reloc10lib2.so reloc10lib3.so reloc10lib4.so reloc10lib5.so"
-$CCLINK -o reloc10 $srcdir/reloc10.c -Wl,--rpath-link,. reloc10lib5.so
+$CCLINK -o reloc10 $srcdir/reloc10.c -Wl,--rpath-link,. reloc10lib5.so -lc reloc10lib{2,3,4}.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./reloc10 > reloc10.log
 $PRELINK ${PRELINK_OPTS--vm} ./reloc10 >> reloc10.log 2>&1 || exit 1
index 5d3f4f1..fa0eab9 100755 (executable)
@@ -7,7 +7,7 @@ $CC -shared -O2 -nostdlib -fpic -o reloc11lib2.so $srcdir/reloc11lib2.c
 $CC -shared -O2 -nostdlib -fpic -o reloc11lib3.so $srcdir/reloc11lib3.c reloc11lib2.so
 BINS="reloc11"
 LIBS="reloc11lib1.so reloc11lib2.so reloc11lib3.so"
-$CCLINK -o reloc11 $srcdir/reloc11.c -Wl,--rpath-link,. reloc11lib1.so reloc11lib3.so
+$CCLINK -o reloc11 $srcdir/reloc11.c -Wl,--rpath-link,. reloc11lib1.so reloc11lib3.so -lc reloc11lib2.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./reloc11 > reloc11.log
 $PRELINK ${PRELINK_OPTS--vm} ./reloc11 >> reloc11.log 2>&1 || exit 1
index 66e1bca..5941798 100755 (executable)
@@ -6,7 +6,7 @@ $CC -shared -O2 -fpic -o reloc3lib1.so $srcdir/reloc3lib1.c
 $CC -shared -O2 -fpic -o reloc3lib2.so $srcdir/reloc1lib2.c reloc3lib1.so
 BINS="reloc3"
 LIBS="reloc3lib1.so reloc3lib2.so"
-$CCLINK -o reloc3 $srcdir/reloc3.c -Wl,--rpath-link,. reloc3lib2.so
+$CCLINK -o reloc3 $srcdir/reloc3.c -Wl,--rpath-link,. reloc3lib2.so -lc reloc3lib1.so
 strip -g $BINS $LIBS
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./reloc3 > reloc3.log
index 6fd733d..2d4e982 100755 (executable)
@@ -21,7 +21,7 @@ $CC -shared -fpic $extra -o reloc4lib2.so reloc4lib2.tmp.c reloc4lib1.so
 $CC -shared -fpic $extra -o reloc4lib3.so reloc4lib3.tmp.c reloc4lib2.so
 BINS="reloc4"
 LIBS="reloc4lib1.so reloc4lib2.so reloc4lib3.so"
-$CCLINK $extra -o reloc4 reloc4.tmp.c -Wl,--rpath-link,. reloc4lib3.so
+$CCLINK $extra -o reloc4 reloc4.tmp.c -Wl,--rpath-link,. reloc4lib3.so -lc reloc4lib2.so
 savelibs
 rm -f reloc4*.tmp reloc4*.tmp.c
 echo $PRELINK ${PRELINK_OPTS--vm} ./reloc4 > reloc4.log
index 16d2b7a..b17cbff 100755 (executable)
@@ -7,7 +7,7 @@ rm -f prelink.cache
 $CC -O2 -o reloc5.tmp $srcdir/reloc5.c
 ./reloc5.tmp > reloc5.tmp.c
 BINS="reloc5"
-$CCLINK -o reloc5 reloc5.tmp.c -Wl,--rpath-link,. reloc4lib3.so
+$CCLINK -o reloc5 reloc5.tmp.c -Wl,--rpath-link,. reloc4lib3.so -lc reloc4lib2.so
 savelibs
 rm -f reloc5*.tmp reloc5*.tmp.c
 echo $PRELINK ${PRELINK_OPTS--vm} ./reloc5 > reloc5.log
index 0ddd8d8..f2a5b17 100755 (executable)
@@ -4,8 +4,8 @@ rm -f reloc6 reloc6lib*.so reloc6.log
 rm -f prelink.cache
 $CC -shared -O2 -fpic -o reloc6lib1.so $srcdir/reloc3lib1.c
 $CC -shared -O2 -fpic -o reloc6lib2.so $srcdir/reloc1lib2.c reloc6lib1.so
-$CCLINK -o reloc6 $srcdir/reloc3.c -Wl,--rpath-link,. reloc6lib2.so
-$CCLINK -o reloc6.nop $srcdir/reloc3.c -Wl,--rpath-link,. reloc6lib2.so
+$CCLINK -o reloc6 $srcdir/reloc3.c -Wl,--rpath-link,. reloc6lib2.so -lc reloc6lib1.so
+$CCLINK -o reloc6.nop $srcdir/reloc3.c -Wl,--rpath-link,. reloc6lib2.so -lc reloc6lib1.so
 echo $PRELINK ${PRELINK_OPTS--vm} ./reloc6 > reloc6.log
 $PRELINK ${PRELINK_OPTS--vm} ./reloc6 >> reloc6.log 2>&1 || exit 1
 grep -q ^`echo $PRELINK | sed 's/ .*$/: /'` reloc6.log && exit 2
index 640ca78..c7dab99 100755 (executable)
@@ -6,7 +6,7 @@ $CC -shared -O2 -Wl,-z,nocombreloc -fpic -o reloc7lib1.so $srcdir/reloc3lib1.c
 $CC -shared -O2 -Wl,-z,nocombreloc -fpic -o reloc7lib2.so $srcdir/reloc1lib2.c reloc7lib1.so
 BINS="reloc7"
 LIBS="reloc7lib1.so reloc7lib2.so"
-$CCLINK -o reloc7 -Wl,-z,nocombreloc $srcdir/reloc7.c -Wl,--rpath-link,. reloc7lib2.so
+$CCLINK -o reloc7 -Wl,-z,nocombreloc $srcdir/reloc7.c -Wl,--rpath-link,. reloc7lib2.so -lc reloc7lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./reloc7 > reloc7.log
 $PRELINK ${PRELINK_OPTS--vm} ./reloc7 >> reloc7.log 2>&1 || exit 1
index 9820d12..7fd6517 100755 (executable)
@@ -17,7 +17,7 @@ $CC -shared -O2 -Wl,-z,nocombreloc -fpic -o reloc8lib1.so $srcdir/reloc3lib1.c
 $CC -shared -O2 -Wl,-z,nocombreloc -fpic -o reloc8lib2.so $srcdir/reloc1lib2.c reloc8lib1.so
 BINS="reloc8"
 LIBS="reloc8lib1.so reloc8lib2.so"
-$CCLINK -o reloc8 $NOCOPYRELOC $srcdir/reloc7.c -Wl,--rpath-link,. reloc8lib2.so
+$CCLINK -o reloc8 $NOCOPYRELOC $srcdir/reloc7.c -Wl,--rpath-link,. reloc8lib2.so -lc reloc8lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./reloc8 > reloc8.log
 $PRELINK ${PRELINK_OPTS--vm} ./reloc8 >> reloc8.log 2>&1 || exit 1
index a835f89..e87f517 100755 (executable)
@@ -17,7 +17,7 @@ $CC -shared -O2 -Wl,-z,nocombreloc -fpic -o reloc9lib1.so $srcdir/reloc3lib1.c
 $CC -shared -O2 -Wl,-z,nocombreloc -fpic -o reloc9lib2.so $srcdir/reloc1lib2.c reloc9lib1.so
 BINS="reloc9"
 LIBS="reloc9lib1.so reloc9lib2.so"
-$CCLINK -o reloc9 -Wl,-z,nocombreloc $NOCOPYRELOC $srcdir/reloc7.c -Wl,--rpath-link,. reloc9lib2.so
+$CCLINK -o reloc9 -Wl,-z,nocombreloc $NOCOPYRELOC $srcdir/reloc7.c -Wl,--rpath-link,. reloc9lib2.so -lc reloc9lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./reloc9 > reloc9.log
 $PRELINK ${PRELINK_OPTS--vm} ./reloc9 >> reloc9.log 2>&1 || exit 1
index 7798d9e..61e596f 100755 (executable)
@@ -6,10 +6,10 @@ $CC -shared -O2 -fpic -o shuffle1lib1.so $srcdir/reloc1lib1.c
 $CC -shared -O2 -fpic -o shuffle1lib2.so $srcdir/reloc1lib2.c shuffle1lib1.so
 BINS="shuffle1"
 LIBS="shuffle1lib1.so shuffle1lib2.so"
-$CCLINK -o shuffle1 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle1lib2.so \
+$CCLINK -o shuffle1 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle1lib2.so -lc shuffle1lib1.so \
   -Wl,--verbose 2>&1 | sed -e '/^=========/,/^=========/!d;/^=========/d' \
   -e 's/0x08048000/0x08000000/;s/SIZEOF_HEADERS.*$/& . += 56;/' > shuffle1.lds
-$CCLINK -o shuffle1 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle1lib2.so \
+$CCLINK -o shuffle1 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle1lib2.so -lc shuffle1lib1.so \
   -Wl,-T,shuffle1.lds
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./shuffle1 > shuffle1.log
index fcfbfb1..953cea3 100755 (executable)
@@ -9,10 +9,10 @@ $CC -shared -O2 -fpic -o shuffle2lib1.so $srcdir/reloc1lib1.c
 $CC -shared -O2 -fpic -o shuffle2lib2.so $srcdir/reloc1lib2.c shuffle2lib1.so
 BINS="shuffle2"
 LIBS="shuffle2lib1.so shuffle2lib2.so"
-$CCLINK -o shuffle2 $srcdir/shuffle2.c -Wl,--rpath-link,. shuffle2lib2.so \
+$CCLINK -o shuffle2 $srcdir/shuffle2.c -Wl,--rpath-link,. shuffle2lib2.so -lc shuffle2lib1.so \
   -Wl,--verbose 2>&1 | sed -e '/^=========/,/^=========/!d;/^=========/d' \
   -e 's/0x08048000/0x08000000/;s/SIZEOF_HEADERS.*$/& . += 56;/' > shuffle2.lds
-$CCLINK -o shuffle2 $srcdir/shuffle2.c -Wl,--rpath-link,. shuffle2lib2.so \
+$CCLINK -o shuffle2 $srcdir/shuffle2.c -Wl,--rpath-link,. shuffle2lib2.so -lc shuffle2lib1.so \
   -Wl,-T,shuffle2.lds
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./shuffle2 > shuffle2.log
index d731102..534d174 100755 (executable)
@@ -10,10 +10,10 @@ $CC -shared -O2 -fpic -o shuffle3lib1.so $srcdir/reloc1lib1.c
 $CC -shared -O2 -fpic -o shuffle3lib2.so $srcdir/reloc1lib2.c shuffle3lib1.so
 BINS="shuffle3"
 LIBS="shuffle3lib1.so shuffle3lib2.so"
-$CCLINK -o shuffle3 $srcdir/shuffle2.c -Wl,--rpath-link,. shuffle3lib2.so \
+$CCLINK -o shuffle3 $srcdir/shuffle2.c -Wl,--rpath-link,. shuffle3lib2.so -lc shuffle3lib1.so \
   -Wl,--verbose 2>&1 | sed -e '/^=========/,/^=========/!d;/^=========/d' \
   -e 's/0x08048000/0x08000000/' > shuffle3.lds
-$CCLINK -o shuffle3 $srcdir/shuffle2.c -Wl,--rpath-link,. shuffle3lib2.so \
+$CCLINK -o shuffle3 $srcdir/shuffle2.c -Wl,--rpath-link,. shuffle3lib2.so -lc shuffle3lib1.so \
   -Wl,-T,shuffle3.lds
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./shuffle3 > shuffle3.log
index 127e224..398972a 100755 (executable)
@@ -6,7 +6,7 @@ case "`uname -r`" in
 esac
 rm -f shuffle4 shuffle4.log
 BINS="shuffle4"
-$CCLINK -o shuffle4 $srcdir/shuffle2.c -Wl,--rpath-link,. shuffle3lib2.so
+$CCLINK -o shuffle4 $srcdir/shuffle2.c -Wl,--rpath-link,. shuffle3lib2.so -lc shuffle3lib1.so 
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./shuffle4 > shuffle4.log
 $PRELINK ${PRELINK_OPTS--vm} ./shuffle4 >> shuffle4.log 2>&1 || exit 1
index ce09d46..e8c0297 100755 (executable)
@@ -6,10 +6,10 @@ $CC -shared -O2 -fpic -o shuffle5lib1.so $srcdir/reloc1lib1.c
 $CC -shared -O2 -fpic -o shuffle5lib2.so $srcdir/reloc1lib2.c shuffle5lib1.so
 BINS="shuffle5"
 LIBS="shuffle5lib1.so shuffle5lib2.so"
-$CCLINK -o shuffle5 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle5lib2.so \
+$CCLINK -o shuffle5 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle5lib2.so -lc shuffle5lib1.so \
   -Wl,--verbose 2>&1 | sed -e '/^=========/,/^=========/!d;/^=========/d' \
   -e 's/0x08048000/0x08000000/;s/SIZEOF_HEADERS.*$/& . += 180;/' > shuffle5.lds
-$CCLINK -o shuffle5 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle5lib2.so \
+$CCLINK -o shuffle5 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle5lib2.so -lc shuffle5lib1.so \
   -Wl,-T,shuffle5.lds
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./shuffle5 > shuffle5.log
index 3eec2ff..cdd16a0 100755 (executable)
@@ -6,10 +6,10 @@ $CC -shared -O2 -fpic -o shuffle6lib1.so $srcdir/reloc1lib1.c
 $CC -shared -O2 -fpic -o shuffle6lib2.so $srcdir/reloc1lib2.c shuffle6lib1.so
 BINS="shuffle6"
 LIBS="shuffle6lib1.so shuffle6lib2.so"
-$CCLINK -o shuffle6 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle6lib2.so \
+$CCLINK -o shuffle6 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle6lib2.so -lc shuffle6lib1.so \
   -Wl,--verbose 2>&1 | sed -e '/^=========/,/^=========/!d;/^=========/d' \
   -e 's/0x08048000/0x08000000/;s/SIZEOF_HEADERS.*$/& . += 56;/' > shuffle6.lds
-$CCLINK -o shuffle6 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle6lib2.so \
+$CCLINK -o shuffle6 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle6lib2.so -lc shuffle6lib1.so \
   -Wl,-T,shuffle6.lds
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./shuffle6 > shuffle6.log
index 23c3c60..4250b26 100755 (executable)
@@ -6,11 +6,11 @@ $CC -shared -O2 -fpic -o shuffle7lib1.so $srcdir/reloc1lib1.c
 $CC -shared -O2 -fpic -o shuffle7lib2.so $srcdir/reloc1lib2.c shuffle7lib1.so
 BINS="shuffle7"
 LIBS="shuffle7lib1.so shuffle7lib2.so"
-$CCLINK -o shuffle7 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle7lib2.so \
+$CCLINK -o shuffle7 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle7lib2.so -lc shuffle7lib1.so \
   -Wl,--verbose 2>&1 | sed -e '/^=========/,/^=========/!d;/^=========/d' \
   -e '/\.hash/a\
   . = . + 0x300;' > shuffle7.lds
-$CCLINK -o shuffle7 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle7lib2.so \
+$CCLINK -o shuffle7 $srcdir/reloc1.c -Wl,--rpath-link,. shuffle7lib2.so -lc shuffle7lib1.so \
   -Wl,-T,shuffle7.lds
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./shuffle7 > shuffle7.log
index d0768a4..7875673 100755 (executable)
@@ -6,7 +6,7 @@ $CC -shared -O2 -fpic -o shuffle8lib1.so $srcdir/reloc1lib1.c
 $CC -shared -O2 -fpic -o shuffle8lib2.so $srcdir/reloc1lib2.c shuffle8lib1.so
 BINS="shuffle8"
 LIBS="shuffle8lib1.so shuffle8lib2.so"
-$CCLINK -o shuffle8 $srcdir/shuffle8.c -Wl,--rpath-link,. shuffle8lib2.so
+$CCLINK -o shuffle8 $srcdir/shuffle8.c -Wl,--rpath-link,. shuffle8lib2.so -lc shuffle8lib1.so
 strip -R .comment shuffle8
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./shuffle8 > shuffle8.log
index 5768890..c974708 100755 (executable)
@@ -6,7 +6,7 @@ case "`uname -r`" in
 esac
 rm -f shuffle9 shuffle9.log
 BINS="shuffle9"
-$CCLINK -o shuffle9 $srcdir/shuffle9.c -Wl,--rpath-link,. shuffle3lib2.so
+$CCLINK -o shuffle9 $srcdir/shuffle9.c -Wl,--rpath-link,. shuffle3lib2.so -lc shuffle3lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./shuffle9 > shuffle9.log
 $PRELINK ${PRELINK_OPTS--vm} ./shuffle9 >> shuffle9.log 2>&1 || exit 1
index 0fb4986..585d179 100755 (executable)
@@ -11,7 +11,7 @@ $CC -shared -O2 -fpic -o tls1lib1.so $srcdir/tls1lib1.c
 $CC -shared -O2 -fpic -o tls1lib2.so $srcdir/tls1lib2.c tls1lib1.so
 BINS="tls1"
 LIBS="tls1lib1.so tls1lib2.so"
-$CCLINK -o tls1 $srcdir/tls1.c -Wl,--rpath-link,. tls1lib2.so
+$CCLINK -o tls1 $srcdir/tls1.c -Wl,--rpath-link,. tls1lib2.so -lc tls1lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./tls1 > tls1.log
 $PRELINK ${PRELINK_OPTS--vm} ./tls1 >> tls1.log 2>&1 || exit 1
index bf9e1eb..6910c16 100755 (executable)
@@ -11,7 +11,7 @@ $CC -shared -O2 -fpic -o tls2lib1.so $srcdir/tls2lib1.c
 $CC -shared -O2 -fpic -o tls2lib2.so $srcdir/tls1lib2.c tls2lib1.so
 BINS="tls2"
 LIBS="tls2lib1.so tls2lib2.so"
-$CCLINK -o tls2 $srcdir/tls2.c -Wl,--rpath-link,. tls2lib2.so
+$CCLINK -o tls2 $srcdir/tls2.c -Wl,--rpath-link,. tls2lib2.so -lc tls2lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./tls2 > tls2.log
 $PRELINK ${PRELINK_OPTS--vm} ./tls2 >> tls2.log 2>&1 || exit 1
index 00dde00..951ee55 100755 (executable)
@@ -23,7 +23,7 @@ $CC -shared -O2 $SHFLAGS -o tls3lib2.so $srcdir/tls3lib2.c \
   tls3lib1.so 2>/dev/null
 BINS="tls3"
 LIBS="tls3lib1.so tls3lib2.so"
-$CCLINK -o tls3 $srcdir/tls1.c -Wl,--rpath-link,. tls3lib2.so
+$CCLINK -o tls3 $srcdir/tls1.c -Wl,--rpath-link,. tls3lib2.so -lc tls3lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./tls3 > tls3.log
 $PRELINK ${PRELINK_OPTS--vm} ./tls3 >> tls3.log 2>&1 || exit 1
index 556a6d5..e00e7cc 100755 (executable)
@@ -12,7 +12,7 @@ $CC -shared -O2 -fpic -o tls4lib2.so $srcdir/tls4lib2.c \
   tls4lib1.so 2>/dev/null
 BINS="tls4"
 LIBS="tls4lib1.so tls4lib2.so"
-$CCLINK -o tls4 $srcdir/tls4.c -Wl,--rpath-link,. tls4lib2.so
+$CCLINK -o tls4 $srcdir/tls4.c -Wl,--rpath-link,. tls4lib2.so -lc tls4lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./tls4 > tls4.log
 $PRELINK ${PRELINK_OPTS--vm} ./tls4 >> tls4.log 2>&1 || exit 1
index dbc0470..7282808 100755 (executable)
@@ -13,7 +13,7 @@ $CC -shared -O2 -fpic -o tls5lib2.so $srcdir/tls1lib2.c \
   -Wl,--rpath-link,. tls5lib1.so
 BINS="tls5"
 LIBS="tls5lib1.so tls5lib2.so tls5lib3.so"
-$CCLINK -o tls5 $srcdir/tls1.c -Wl,--rpath-link,. tls5lib2.so
+$CCLINK -o tls5 $srcdir/tls1.c -Wl,--rpath-link,. tls5lib2.so -lc tls5lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./tls5 > tls5.log
 $PRELINK ${PRELINK_OPTS--vm} ./tls5 >> tls5.log 2>&1 || exit 1
index 2d854d9..6a64f02 100755 (executable)
@@ -13,7 +13,7 @@ $CC -shared -O2 -fpic -o tls6lib2.so $srcdir/tls1lib2.c \
   -Wl,--rpath-link,. tls6lib1.so
 BINS="tls6"
 LIBS="tls6lib1.so tls6lib2.so tls6lib3.so"
-$CCLINK -o tls6 $srcdir/tls2.c -Wl,--rpath-link,. tls6lib2.so
+$CCLINK -o tls6 $srcdir/tls2.c -Wl,--rpath-link,. tls6lib2.so -lc tls6lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./tls6 > tls6.log
 $PRELINK ${PRELINK_OPTS--vm} ./tls6 >> tls6.log 2>&1 || exit 1
index d8436a5..68eee1f 100755 (executable)
@@ -6,7 +6,7 @@ $CC -shared -O2 -fpic -o undo1lib1.so $srcdir/reloc1lib1.c
 $CC -shared -O2 -fpic -o undo1lib2.so $srcdir/reloc1lib2.c undo1lib1.so
 BINS="undo1"
 LIBS="undo1lib1.so undo1lib2.so"
-$CCLINK -o undo1 $srcdir/reloc1.c -Wl,--rpath-link,. undo1lib2.so
+$CCLINK -o undo1 $srcdir/reloc1.c -Wl,--rpath-link,. undo1lib2.so -lc undo1lib1.so
 savelibs
 echo $PRELINK ${PRELINK_OPTS--vm} ./undo1 > undo1.log
 $PRELINK ${PRELINK_OPTS--vm} ./undo1 >> undo1.log 2>&1 || exit 1
diff --git a/testsuite/unprel1.c b/testsuite/unprel1.c
new file mode 100644 (file)
index 0000000..0c8e9f9
--- /dev/null
@@ -0,0 +1,7 @@
+extern int bar ();
+
+int
+main ()
+{
+  return bar () - 42;
+}
diff --git a/testsuite/unprel1.sh b/testsuite/unprel1.sh
new file mode 100755 (executable)
index 0000000..0463358
--- /dev/null
@@ -0,0 +1,55 @@
+#!/bin/bash
+. `dirname $0`/functions.sh
+PRELINK=`echo $PRELINK \
+        | sed -e 's, \./\(prelink\.\(cache\|conf\)\), unprel1.tree/etc/\1,g' \
+              -e 's,path=\.,path=unprel1.tree/opt:unprel1.tree/lib,' \
+              -e 's,linker=\./,linker=unprel1.tree/lib/,'`
+CCLINK=`echo $CCLINK \
+       | sed -e 's,linker=\./,linker=unprel1.tree/lib/,'`
+rm -rf unprel1.tree
+rm -f unprel1.log
+mkdir -p unprel1.tree/{lib,etc,opt,bin}
+$CC -shared -O2 -fpic -o unprel1.tree/lib/lib1.so $srcdir/unprel1lib1.c
+cp -a unprel1.tree/{lib,opt}/lib1.so
+$CC -shared -O2 -fpic -o unprel1.tree/lib/lib2.so $srcdir/unprel1lib2.c \
+    -L unprel1.tree/lib -l1
+$CCLINK -o unprel1.tree/bin/bin1 $srcdir/unprel1.c \
+    -Wl,-rpath,unprel1.tree/lib -L unprel1.tree/lib -l2
+cat > unprel1.tree/etc/prelink.conf <<EOF
+unprel1.tree/bin
+unprel1.tree/lib
+EOF
+for lib in `cat syslib.list`; do
+  cp -p $lib.orig unprel1.tree/lib/$lib
+  cp -p $lib.orig unprel1.tree/lib/$lib.orig
+done
+for lib in `cat syslnk.list`; do
+  cp -dp $lib unprel1.tree/lib
+done
+LIBS="unprel1.tree/lib/lib1.so unprel1.tree/lib/lib2.so"
+LIBS="$LIBS unprel1.tree/opt/lib1.so"
+BINS="unprel1.tree/bin/bin1"
+savelibs
+chmod -x unprel1.tree/bin/bin1.orig
+echo $PRELINK ${PRELINK_OPTS--vm} unprel1.tree/{bin,lib} > unprel1.log
+$PRELINK ${PRELINK_OPTS--vm} unprel1.tree/{bin,lib} >> unprel1.log 2>&1 || exit 1
+grep -v 'opt/lib1.so is not present in any config file directories' unprel1.log \
+  | grep -v 'lib/lib2.so because its dependency unprel1.tree/opt/lib1.so could not be prelinked' \
+  | grep -v 'bin/bin1 because its dependency unprel1.tree/lib/lib2.so could not be prelinked' \
+  | grep -q ^`echo $PRELINK | sed 's/ .*$/: /'` && exit 2
+grep -q 'opt/lib1.so is not present in any config file directories' \
+  unprel1.log || exit 3
+grep -q 'lib/lib2.so because its dependency unprel1.tree/opt/lib1.so could not be prelinked' \
+  unprel1.log || exit 4
+grep -q 'bin/bin1 because its dependency unprel1.tree/lib/lib2.so could not be prelinked' \
+  unprel1.log || exit 5
+unprel1.tree/bin/bin1 || exit 6
+# So that it is not prelinked again
+chmod -x unprel1.tree/bin/bin1
+LIBS=unprel1.tree/lib/lib1.so
+BINS=
+comparelibs >> unprel1.log 2>&1 || exit 7
+for i in unprel1.tree/lib/lib2.so unprel1.tree/opt/lib1.so unprel1.tree/bin/bin1; do
+  cmp -s $i $i.orig || exit 8
+done
+exit 0
diff --git a/testsuite/unprel1lib1.c b/testsuite/unprel1lib1.c
new file mode 100644 (file)
index 0000000..8f85da3
--- /dev/null
@@ -0,0 +1,5 @@
+int
+baz ()
+{
+  return 42;
+}
diff --git a/testsuite/unprel1lib2.c b/testsuite/unprel1lib2.c
new file mode 100644 (file)
index 0000000..4783123
--- /dev/null
@@ -0,0 +1,7 @@
+extern int baz ();
+
+int
+bar ()
+{
+  return baz ();
+}