include/coff/
authorRichard Sandiford <rdsandiford@googlemail.com>
Sat, 14 Mar 2009 09:35:46 +0000 (09:35 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Sat, 14 Mar 2009 09:35:46 +0000 (09:35 +0000)
* xcoff.h (XCOFF_EXPALL, XCOFF_EXPFULL): New flags.
(xcoff_loader_info): Add auto_export_flags.

bfd/
* bfd-in.h (bfd_xcoff_size_dynamic_sections): Replace the
bfd_boolean export_defineds parameter with an unsigned int
auto_export_flags parameter.
* bfd-in2.h: Regenerate.
* xcofflink.c (xcoff_archive_contains_shared_object_p): New function,
split out from xcoff_build_ldsyms.
(xcoff_covered_by_expall_p): New function.
(xcoff_auto_export_p): New function, split out from xcoff_build_ldsyms
but with extra code to handle -bexpfull and -bexpall.
(xcoff_mark_auto_exports): New function.
(xcoff_build_ldsyms): Use xcoff_auto_export_p to decide whether
a function should be automatically exported.
(bfd_xcoff_size_dynamic_sections): Replace the export_defineds
parameter with an auto_export_flags parameter.  Update ldinfo
accordingly.  Use xcoff_mark_auto_exports to mark all automatically-
exported symbols.

ld/
* emultempl/aix.em (auto_export_flags): New variable.
(explicit_auto_export_flags): Likewise.
(OPTION_EXPALL, OPTION_EXPFULL): New enum values.
(OPTION_NOEXPALL, OPTION_NOEXPFULL): Likewise.
(gld${EMULATION_NAME}_add_options): Add -bexpall, -bexpfull,
-bnoexpall and -bnoexpfull.
(gld${EMULATION_NAME}_handle_option): Handle them.
(gld${EMULATION_NAME}_before_allocation): Update the call to
bfd_size_dynamic_sections.

ld/testsuite/
* ld-powerpc/aix-export-1-all.dd, ld-powerpc/aix-export-1-full.dd,
ld-powerpc/aix-export-1a.s, ld-powerpc/aix-export-1b.s: New tests.
* ld-powerpc/aix52.exp: Run them.

14 files changed:
bfd/ChangeLog
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/xcofflink.c
include/coff/ChangeLog
include/coff/xcoff.h
ld/ChangeLog
ld/emultempl/aix.em
ld/testsuite/ChangeLog
ld/testsuite/ld-powerpc/aix-export-1-all.dd [new file with mode: 0644]
ld/testsuite/ld-powerpc/aix-export-1-full.dd [new file with mode: 0644]
ld/testsuite/ld-powerpc/aix-export-1a.s [new file with mode: 0644]
ld/testsuite/ld-powerpc/aix-export-1b.s [new file with mode: 0644]
ld/testsuite/ld-powerpc/aix52.exp

index 4bad45e1e6c9b780b45b37bd8fcf60d8ae7c81de..79e3cb44c449a6fc08677408d69284dcfca12065 100644 (file)
@@ -1,3 +1,22 @@
+2009-03-14  Richard Sandiford  <r.sandiford@uk.ibm.com>
+
+       * bfd-in.h (bfd_xcoff_size_dynamic_sections): Replace the
+       bfd_boolean export_defineds parameter with an unsigned int
+       auto_export_flags parameter.
+       * bfd-in2.h: Regenerate.
+       * xcofflink.c (xcoff_archive_contains_shared_object_p): New function,
+       split out from xcoff_build_ldsyms.
+       (xcoff_covered_by_expall_p): New function.
+       (xcoff_auto_export_p): New function, split out from xcoff_build_ldsyms
+       but with extra code to handle -bexpfull and -bexpall.
+       (xcoff_mark_auto_exports): New function.
+       (xcoff_build_ldsyms): Use xcoff_auto_export_p to decide whether
+       a function should be automatically exported.
+       (bfd_xcoff_size_dynamic_sections): Replace the export_defineds
+       parameter with an auto_export_flags parameter.  Update ldinfo
+       accordingly.  Use xcoff_mark_auto_exports to mark all automatically-
+       exported symbols.
+
 2009-03-14  Richard Sandiford  <r.sandiford@uk.ibm.com>
 
        * xcofflink.c (xcoff_mark_symbol_by_name): New function.
index 6b4901330f889bc875f3cebacad0084a534aa4c0..5a3e13f1bbb2f8a3a9b06ef537f2069c4ea8ccc5 100644 (file)
@@ -779,7 +779,7 @@ extern bfd_boolean bfd_xcoff_record_link_assignment
 extern bfd_boolean bfd_xcoff_size_dynamic_sections
   (bfd *, struct bfd_link_info *, const char *, const char *,
    unsigned long, unsigned long, unsigned long, bfd_boolean,
-   int, bfd_boolean, bfd_boolean, struct bfd_section **, bfd_boolean);
+   int, bfd_boolean, unsigned int, struct bfd_section **, bfd_boolean);
 extern bfd_boolean bfd_xcoff_link_generate_rtinit
   (bfd *, const char *, const char *, bfd_boolean);
 
index 7e3defde56b54aac633be6c26ed0756c7ad76c60..a173f568ed125c9fecb83a9006d78c4040158864 100644 (file)
@@ -786,7 +786,7 @@ extern bfd_boolean bfd_xcoff_record_link_assignment
 extern bfd_boolean bfd_xcoff_size_dynamic_sections
   (bfd *, struct bfd_link_info *, const char *, const char *,
    unsigned long, unsigned long, unsigned long, bfd_boolean,
-   int, bfd_boolean, bfd_boolean, struct bfd_section **, bfd_boolean);
+   int, bfd_boolean, unsigned int, struct bfd_section **, bfd_boolean);
 extern bfd_boolean bfd_xcoff_link_generate_rtinit
   (bfd *, const char *, const char *, bfd_boolean);
 
index 3ca9b7287ada123acd780a0a5defa1ae1648e4a8..da5944eb818ff89b0918d1f30206db5da2171adf 100644 (file)
@@ -2313,6 +2313,97 @@ xcoff_set_import_path (struct bfd_link_info *info,
   return TRUE;
 }
 \f
+/* Return true if the given bfd contains at least one shared object.  */
+
+static bfd_boolean
+xcoff_archive_contains_shared_object_p (bfd *archive)
+{
+  bfd *member;
+
+  member = bfd_openr_next_archived_file (archive, NULL);
+  while (member != NULL && (member->flags & DYNAMIC) == 0)
+    member = bfd_openr_next_archived_file (archive, member);
+  return member != NULL;
+}
+
+/* Symbol H qualifies for export by -bexpfull.  Return true if it also
+   qualifies for export by -bexpall.  */
+
+static bfd_boolean
+xcoff_covered_by_expall_p (struct xcoff_link_hash_entry *h)
+{
+  /* Exclude symbols beginning with '_'.  */
+  if (h->root.root.string[0] == '_')
+    return FALSE;
+
+  /* Exclude archive members that would otherwise be unreferenced.  */
+  if ((h->flags & XCOFF_MARK) == 0
+      && (h->root.type == bfd_link_hash_defined
+         || h->root.type == bfd_link_hash_defweak)
+      && h->root.u.def.section->owner != NULL
+      && h->root.u.def.section->owner->my_archive != NULL)
+    return FALSE;
+
+  return TRUE;
+}
+
+/* Return true if symbol H qualifies for the forms of automatic export
+   specified by AUTO_EXPORT_FLAGS.  */
+
+static bfd_boolean
+xcoff_auto_export_p (struct xcoff_link_hash_entry *h,
+                    unsigned int auto_export_flags)
+{
+  /* Don't automatically export things that were explicitly exported.  */
+  if ((h->flags & XCOFF_EXPORT) != 0)
+    return FALSE;
+
+  /* Don't export things that we don't define.  */
+  if ((h->flags & XCOFF_DEF_REGULAR) == 0)
+    return FALSE;
+
+  /* Don't export functions; export their descriptors instead.  */
+  if (h->root.root.string[0] == '.')
+    return FALSE;
+
+  /* We don't export a symbol which is being defined by an object
+     included from an archive which contains a shared object.  The
+     rationale is that if an archive contains both an unshared and
+     a shared object, then there must be some reason that the
+     unshared object is unshared, and we don't want to start
+     providing a shared version of it.  In particular, this solves
+     a bug involving the _savefNN set of functions.  gcc will call
+     those functions without providing a slot to restore the TOC,
+     so it is essential that these functions be linked in directly
+     and not from a shared object, which means that a shared
+     object which also happens to link them in must not export
+     them.  This is confusing, but I haven't been able to think of
+     a different approach.  Note that the symbols can, of course,
+     be exported explicitly.  */
+  if (h->root.type == bfd_link_hash_defined
+      || h->root.type == bfd_link_hash_defweak)
+    {
+      bfd *owner;
+
+      owner = h->root.u.def.section->owner;
+      if (owner != NULL
+         && owner->my_archive != NULL
+         && xcoff_archive_contains_shared_object_p (owner->my_archive))
+       return FALSE;
+    }
+
+  /* Otherwise, all symbols are exported by -bexpfull.  */
+  if ((auto_export_flags & XCOFF_EXPFULL) != 0)
+    return TRUE;
+
+  /* Despite its name, -bexpall exports most but not all symbols.  */
+  if ((auto_export_flags & XCOFF_EXPALL) != 0
+      && xcoff_covered_by_expall_p (h))
+    return TRUE;
+
+  return FALSE;
+}
+\f
 /* Mark a symbol as not being garbage, including the section in which
    it is defined.  */
 
@@ -2878,6 +2969,24 @@ bfd_xcoff_record_link_assignment (bfd *output_bfd,
   return TRUE;
 }
 
+/* An xcoff_link_hash_traverse callback for which DATA points to an
+   xcoff_loader_info.  Mark all symbols that should be automatically
+   exported.  */
+
+static bfd_boolean
+xcoff_mark_auto_exports (struct xcoff_link_hash_entry *h, void *data)
+{
+  struct xcoff_loader_info *ldinfo;
+
+  ldinfo = (struct xcoff_loader_info *) data;
+  if (xcoff_auto_export_p (h, ldinfo->auto_export_flags))
+    {
+      if (!xcoff_mark_symbol (ldinfo->info, h))
+       ldinfo->failed = TRUE;
+    }
+  return TRUE;
+}
+
 /* Add a symbol to the .loader symbols, if necessary.  */
 
 /* INPUT_BFD has an external symbol associated with hash table entry H
@@ -2939,50 +3048,8 @@ xcoff_build_ldsyms (struct xcoff_link_hash_entry *h, void * p)
   /* If all defined symbols should be exported, mark them now.  We
      don't want to export the actual functions, just the function
      descriptors.  */
-  if (ldinfo->export_defineds
-      && (h->flags & XCOFF_DEF_REGULAR) != 0
-      && h->root.root.string[0] != '.')
-    {
-      bfd_boolean export;
-
-      /* We don't export a symbol which is being defined by an object
-        included from an archive which contains a shared object.  The
-        rationale is that if an archive contains both an unshared and
-        a shared object, then there must be some reason that the
-        unshared object is unshared, and we don't want to start
-        providing a shared version of it.  In particular, this solves
-        a bug involving the _savefNN set of functions.  gcc will call
-        those functions without providing a slot to restore the TOC,
-        so it is essential that these functions be linked in directly
-        and not from a shared object, which means that a shared
-        object which also happens to link them in must not export
-        them.  This is confusing, but I haven't been able to think of
-        a different approach.  Note that the symbols can, of course,
-        be exported explicitly.  */
-      export = TRUE;
-      if ((h->root.type == bfd_link_hash_defined
-          || h->root.type == bfd_link_hash_defweak)
-         && h->root.u.def.section->owner != NULL
-         && h->root.u.def.section->owner->my_archive != NULL)
-       {
-         bfd *arbfd, *member;
-
-         arbfd = h->root.u.def.section->owner->my_archive;
-         member = bfd_openr_next_archived_file (arbfd, NULL);
-         while (member != NULL)
-           {
-             if ((member->flags & DYNAMIC) != 0)
-               {
-                 export = FALSE;
-                 break;
-               }
-             member = bfd_openr_next_archived_file (arbfd, member);
-           }
-       }
-
-      if (export)
-       h->flags |= XCOFF_EXPORT;
-    }
+  if (xcoff_auto_export_p (h, ldinfo->auto_export_flags))
+    h->flags |= XCOFF_EXPORT;
 
   /* We don't want to garbage collect symbols which are not defined in
      XCOFF files.  This is a convenient place to mark them.  */
@@ -3181,10 +3248,9 @@ xcoff_keep_symbol_p (struct bfd_link_info *info, bfd *input_bfd,
    -bmaxdata linker option).  GC is whether to do garbage collection
    (the -bgc linker option).  MODTYPE is the module type (the
    -bmodtype linker option).  TEXTRO is whether the text section must
-   be read only (the -btextro linker option).  EXPORT_DEFINEDS is
-   whether all defined symbols should be exported (the -unix linker
-   option).  SPECIAL_SECTIONS is set by this routine to csects with
-   magic names like _end.  */
+   be read only (the -btextro linker option).  AUTO_EXPORT_FLAGS
+   is a mask of XCOFF_EXPALL and XCOFF_EXPFULL.  SPECIAL_SECTIONS
+   is set by this routine to csects with magic names like _end.  */
 
 bfd_boolean
 bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
@@ -3197,7 +3263,7 @@ bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
                                 bfd_boolean gc,
                                 int modtype,
                                 bfd_boolean textro,
-                                bfd_boolean export_defineds,
+                                unsigned int auto_export_flags,
                                 asection **special_sections,
                                 bfd_boolean rtld)
 {
@@ -3225,7 +3291,7 @@ bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
   ldinfo.failed = FALSE;
   ldinfo.output_bfd = output_bfd;
   ldinfo.info = info;
-  ldinfo.export_defineds = export_defineds;
+  ldinfo.auto_export_flags = auto_export_flags;
   ldinfo.ldsym_count = 0;
   ldinfo.string_size = 0;
   ldinfo.strings = NULL;
@@ -3328,6 +3394,13 @@ bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
       if (info->fini_function != NULL
          && !xcoff_mark_symbol_by_name (info, info->fini_function, 0))
        goto error_return;
+      if (auto_export_flags != 0)
+       {
+         xcoff_link_hash_traverse (xcoff_hash_table (info),
+                                   xcoff_mark_auto_exports, &ldinfo);
+         if (ldinfo.failed)
+           goto error_return;
+       }
       xcoff_sweep (info);
       xcoff_hash_table (info)->gc = TRUE;
     }
index 09cd87322f1738b8d9fa39202eeef03e4fc0a5cf..ba5fa3fe08b1cdcbbc81b25493c3f8cb40738389 100644 (file)
@@ -1,3 +1,8 @@
+2009-03-14  Richard Sandiford  <r.sandiford@uk.ibm.com>
+
+       * xcoff.h (XCOFF_EXPALL, XCOFF_EXPFULL): New flags.
+       (xcoff_loader_info): Add auto_export_flags.
+
 2009-03-14  Richard Sandiford  <r.sandiford@uk.ibm.com>
 
        * internal.h (C_AIX_WEAKEXT): New macro.
index 4f9f7edee7de67990fb8b915bdedcc089fb5d2b4..4439dc99b1fa38074289168da029c96ba1338ec5 100644 (file)
@@ -394,6 +394,9 @@ struct xcoff_link_hash_table
   asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
 };
 
+/* These flags indicate which of -bexpall and -bexpfull are in effect.  */
+#define XCOFF_EXPALL 1
+#define XCOFF_EXPFULL 2
 
 /* This structure is used to pass information through
    xcoff_link_hash_traverse.  */
@@ -409,8 +412,8 @@ struct xcoff_loader_info
   /* Link information structure.  */
   struct bfd_link_info *info;
 
-  /* Whether all defined symbols should be exported.  */
-  bfd_boolean export_defineds;
+  /* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags.  */
+  unsigned int auto_export_flags;
 
   /* Number of ldsym structures.  */
   size_t ldsym_count;
index 40434ebe769555ac84cfb8ad1e89fb06722e0b60..d41dd9b9de2dcf0a0bfc103924a655ed052a9e9b 100644 (file)
@@ -1,3 +1,15 @@
+2009-03-14  Richard Sandiford  <r.sandiford@uk.ibm.com>
+
+       * emultempl/aix.em (auto_export_flags): New variable.
+       (explicit_auto_export_flags): Likewise.
+       (OPTION_EXPALL, OPTION_EXPFULL): New enum values.
+       (OPTION_NOEXPALL, OPTION_NOEXPFULL): Likewise.
+       (gld${EMULATION_NAME}_add_options): Add -bexpall, -bexpfull,
+       -bnoexpall and -bnoexpfull.
+       (gld${EMULATION_NAME}_handle_option): Handle them.
+       (gld${EMULATION_NAME}_before_allocation): Update the call to
+       bfd_size_dynamic_sections.
+
 2009-03-14  Richard Sandiford  <r.sandiford@uk.ibm.com>
 
        * emultempl/aix.em (gld${EMULATION_NAME}_handle_option): Make
index a9f3884055135d8d076215bf3f68e5d32536a349..85586607b5c800d85f6ca8923cb3d87024233b12 100644 (file)
@@ -84,6 +84,14 @@ static unsigned short modtype = ('1' << 8) | 'L';
    permitted).  */
 static int textro;
 
+/* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags, as set by their
+   associated -b and -bno options.  */
+static unsigned int auto_export_flags;
+
+/* A mask of auto_export_flags bits that were explicitly set on the
+   command line.  */
+static unsigned int explicit_auto_export_flags;
+
 /* Whether to implement Unix like linker semantics.  */
 static int unix_ld;
 
@@ -156,6 +164,8 @@ enum
     OPTION_AUTOIMP,
     OPTION_ERNOTOK,
     OPTION_EROK,
+    OPTION_EXPALL,
+    OPTION_EXPFULL,
     OPTION_EXPORT,
     OPTION_IMPORT,
     OPTION_INITFINI,
@@ -164,6 +174,8 @@ enum
     OPTION_MAXSTACK,
     OPTION_MODTYPE,
     OPTION_NOAUTOIMP,
+    OPTION_NOEXPALL,
+    OPTION_NOEXPFULL,
     OPTION_NOSTRCMPCT,
     OPTION_PD,
     OPTION_PT,
@@ -201,6 +213,8 @@ gld${EMULATION_NAME}_add_options
     {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
     {"berok", no_argument, NULL, OPTION_EROK},
     {"berrmsg", no_argument, NULL, OPTION_IGNORE},
+    {"bexpall", no_argument, NULL, OPTION_EXPALL},
+    {"bexpfull", no_argument, NULL, OPTION_EXPFULL},
     {"bexport", required_argument, NULL, OPTION_EXPORT},
     {"bf", no_argument, NULL, OPTION_ERNOTOK},
     {"bgc", no_argument, &gc, 1},
@@ -216,6 +230,8 @@ gld${EMULATION_NAME}_add_options
     {"bM", required_argument, NULL, OPTION_MODTYPE},
     {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
     {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
+    {"bnoexpall", no_argument, NULL, OPTION_NOEXPALL},
+    {"bnoexpfull", no_argument, NULL, OPTION_NOEXPFULL},
     {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
     {"bnoentry", no_argument, NULL, OPTION_IGNORE},
     {"bnogc", no_argument, &gc, 0},
@@ -388,6 +404,16 @@ gld${EMULATION_NAME}_handle_option (int optc)
       link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
       break;
 
+    case OPTION_EXPALL:
+      auto_export_flags |= XCOFF_EXPALL;
+      explicit_auto_export_flags |= XCOFF_EXPALL;
+      break;
+
+    case OPTION_EXPFULL:
+      auto_export_flags |= XCOFF_EXPFULL;
+      explicit_auto_export_flags |= XCOFF_EXPFULL;
+      break;
+
     case OPTION_EXPORT:
       gld${EMULATION_NAME}_read_file (optarg, FALSE);
       break;
@@ -444,6 +470,16 @@ gld${EMULATION_NAME}_handle_option (int optc)
       link_info.static_link = TRUE;
       break;
 
+    case OPTION_NOEXPALL:
+      auto_export_flags &= ~XCOFF_EXPALL;
+      explicit_auto_export_flags |= XCOFF_EXPALL;
+      break;
+
+    case OPTION_NOEXPFULL:
+      auto_export_flags &= ~XCOFF_EXPFULL;
+      explicit_auto_export_flags |= XCOFF_EXPFULL;
+      break;
+
     case OPTION_NOSTRCMPCT:
       link_info.traditional_format = TRUE;
       break;
@@ -624,7 +660,7 @@ gld${EMULATION_NAME}_before_allocation (void)
     ".data",
     ".bss"
   };
-  unsigned int i;
+  unsigned int i, flags;
 
   /* Handle the import and export files, if any.  */
   for (fl = import_files; fl != NULL; fl = fl->next)
@@ -710,11 +746,16 @@ gld${EMULATION_NAME}_before_allocation (void)
        }
     }
 
+  /* Default to -bexpfull for SVR4-like semantics.  */
+  flags = (unix_ld ? XCOFF_EXPFULL : 0);
+  flags &= ~explicit_auto_export_flags;
+  flags |= auto_export_flags;
+
   /* Let the XCOFF backend set up the .loader section.  */
   if (!bfd_xcoff_size_dynamic_sections
       (link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align,
        maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE,
-       modtype,        textro ? TRUE : FALSE, unix_ld, special_sections,
+       modtype, textro ? TRUE : FALSE, flags, special_sections,
        rtld ? TRUE : FALSE))
     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
 
index a2cdc378e692dafaf5a8c5d669740b3113eab45e..df1fd84d6835eaaa60396f88d423cdc1e3ccae1d 100644 (file)
@@ -1,3 +1,9 @@
+2009-03-14  Richard Sandiford  <r.sandiford@uk.ibm.com>
+
+       * ld-powerpc/aix-export-1-all.dd, ld-powerpc/aix-export-1-full.dd,
+       ld-powerpc/aix-export-1a.s, ld-powerpc/aix-export-1b.s: New tests.
+       * ld-powerpc/aix52.exp: Run them.
+
 2009-03-14  Richard Sandiford  <r.sandiford@uk.ibm.com>
 
        * ld-powerpc/aix-gc-1.s, ld-powerpc/aix-gc-1.ex,
diff --git a/ld/testsuite/ld-powerpc/aix-export-1-all.dd b/ld/testsuite/ld-powerpc/aix-export-1-all.dd
new file mode 100644 (file)
index 0000000..90eec95
--- /dev/null
@@ -0,0 +1,11 @@
+
+.*
+
+
+Disassembly of section \.data:
+
+0*10000000 <main1>:
+ *10000000:    10 00 00 04     .*
+
+0*10000004 <lib1>:
+ *10000004:    11 11 00 01     .*
diff --git a/ld/testsuite/ld-powerpc/aix-export-1-full.dd b/ld/testsuite/ld-powerpc/aix-export-1-full.dd
new file mode 100644 (file)
index 0000000..d300fa2
--- /dev/null
@@ -0,0 +1,21 @@
+
+.*
+
+
+Disassembly of section .data:
+
+0*10000000 <main1>:
+ *10000000:    10 00 00 08     .*
+
+0*10000004 <_main2>:
+ *10000004:    10 00 00 0c     .*
+
+0*10000008 <lib1>:
+ *10000008:    11 11 00 01     .*
+
+0*1000000c <_lib2>:
+ *1000000c:    11 11 00 02     .*
+
+0*10000010 <lib3>:
+ *10000010:    11 11 00 03     .*
+ *10000014:    00 00 00 00     .*
diff --git a/ld/testsuite/ld-powerpc/aix-export-1a.s b/ld/testsuite/ld-powerpc/aix-export-1a.s
new file mode 100644 (file)
index 0000000..69701e5
--- /dev/null
@@ -0,0 +1,14 @@
+       .globl  lib1
+       .csect  lib1[RW]
+lib1:
+       .long   0x11110001
+
+       .globl  _lib2
+       .csect  _lib2[RW]
+_lib2:
+       .long   0x11110002
+
+       .globl  lib3
+       .csect  lib3[RW]
+lib3:
+       .long   0x11110003
diff --git a/ld/testsuite/ld-powerpc/aix-export-1b.s b/ld/testsuite/ld-powerpc/aix-export-1b.s
new file mode 100644 (file)
index 0000000..32c355d
--- /dev/null
@@ -0,0 +1,9 @@
+       .globl  main1
+       .csect  main1[RW]
+main1:
+       .long   lib1
+
+       .globl  _main2
+       .csect  _main2[RW]
+_main2:
+       .long   _lib2
index 330de2778521a27cd790684e1c92ecd9cb15485b..fb2307a6fdc5aadfbff101accb09ead324a36863 100644 (file)
@@ -108,6 +108,26 @@ set aix52tests {
       {nm -D aix-no-dup-syms-1-dso.dnd} {objdump -R aix-no-dup-syms-1-dso.drd}}
      "aix-no-dup-syms-1.so"}
 
+    {"Export test 1 (archive)" ""
+      "" {aix-export-1a.s}
+      {} "libaix-export-1.a"}
+
+    {"Export test 1 (object)" "-r"
+      "" {aix-export-1b.s}
+      {} "aix-export-1.o"}
+
+    {"Export test 1 (-bexpall)"
+     "-shared -bexpall tmpdir/aix-export-1.o -Ltmpdir -laix-export-1"
+     "" {}
+     {{objdump -dj.data aix-export-1-all.dd}}
+     "aix-export-1-all.so"}
+
+    {"Export test 1 (-bexpfull)"
+     "-shared -bexpfull tmpdir/aix-export-1.o -Ltmpdir -laix-export-1"
+     "" {}
+     {{objdump -dj.data aix-export-1-full.dd}}
+     "aix-export-1-full.so"}
+
     {"Garbage collection test 1"
      "-shared -binitfini:init_function:fini_function -bE:aix-gc-1.ex"
      "" {aix-gc-1.s}