include/coff/

* 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.
This commit is contained in:
Richard Sandiford 2009-03-14 09:35:46 +00:00
parent 7d504122ef
commit b64232cca5
14 changed files with 290 additions and 56 deletions

View 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> 2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com>
* xcofflink.c (xcoff_mark_symbol_by_name): New function. * xcofflink.c (xcoff_mark_symbol_by_name): New function.

View File

@ -779,7 +779,7 @@ extern bfd_boolean bfd_xcoff_record_link_assignment
extern bfd_boolean bfd_xcoff_size_dynamic_sections extern bfd_boolean bfd_xcoff_size_dynamic_sections
(bfd *, struct bfd_link_info *, const char *, const char *, (bfd *, struct bfd_link_info *, const char *, const char *,
unsigned long, unsigned long, unsigned long, bfd_boolean, 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 extern bfd_boolean bfd_xcoff_link_generate_rtinit
(bfd *, const char *, const char *, bfd_boolean); (bfd *, const char *, const char *, bfd_boolean);

View File

@ -786,7 +786,7 @@ extern bfd_boolean bfd_xcoff_record_link_assignment
extern bfd_boolean bfd_xcoff_size_dynamic_sections extern bfd_boolean bfd_xcoff_size_dynamic_sections
(bfd *, struct bfd_link_info *, const char *, const char *, (bfd *, struct bfd_link_info *, const char *, const char *,
unsigned long, unsigned long, unsigned long, bfd_boolean, 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 extern bfd_boolean bfd_xcoff_link_generate_rtinit
(bfd *, const char *, const char *, bfd_boolean); (bfd *, const char *, const char *, bfd_boolean);

View File

@ -2313,6 +2313,97 @@ xcoff_set_import_path (struct bfd_link_info *info,
return TRUE; return TRUE;
} }
/* 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;
}
/* Mark a symbol as not being garbage, including the section in which /* Mark a symbol as not being garbage, including the section in which
it is defined. */ it is defined. */
@ -2878,6 +2969,24 @@ bfd_xcoff_record_link_assignment (bfd *output_bfd,
return TRUE; 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. */ /* Add a symbol to the .loader symbols, if necessary. */
/* INPUT_BFD has an external symbol associated with hash table entry H /* 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 /* If all defined symbols should be exported, mark them now. We
don't want to export the actual functions, just the function don't want to export the actual functions, just the function
descriptors. */ descriptors. */
if (ldinfo->export_defineds if (xcoff_auto_export_p (h, ldinfo->auto_export_flags))
&& (h->flags & XCOFF_DEF_REGULAR) != 0 h->flags |= XCOFF_EXPORT;
&& 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;
}
/* We don't want to garbage collect symbols which are not defined in /* We don't want to garbage collect symbols which are not defined in
XCOFF files. This is a convenient place to mark them. */ 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 -bmaxdata linker option). GC is whether to do garbage collection
(the -bgc linker option). MODTYPE is the module type (the (the -bgc linker option). MODTYPE is the module type (the
-bmodtype linker option). TEXTRO is whether the text section must -bmodtype linker option). TEXTRO is whether the text section must
be read only (the -btextro linker option). EXPORT_DEFINEDS is be read only (the -btextro linker option). AUTO_EXPORT_FLAGS
whether all defined symbols should be exported (the -unix linker is a mask of XCOFF_EXPALL and XCOFF_EXPFULL. SPECIAL_SECTIONS
option). SPECIAL_SECTIONS is set by this routine to csects with is set by this routine to csects with magic names like _end. */
magic names like _end. */
bfd_boolean bfd_boolean
bfd_xcoff_size_dynamic_sections (bfd *output_bfd, bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
@ -3197,7 +3263,7 @@ bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
bfd_boolean gc, bfd_boolean gc,
int modtype, int modtype,
bfd_boolean textro, bfd_boolean textro,
bfd_boolean export_defineds, unsigned int auto_export_flags,
asection **special_sections, asection **special_sections,
bfd_boolean rtld) bfd_boolean rtld)
{ {
@ -3225,7 +3291,7 @@ bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
ldinfo.failed = FALSE; ldinfo.failed = FALSE;
ldinfo.output_bfd = output_bfd; ldinfo.output_bfd = output_bfd;
ldinfo.info = info; ldinfo.info = info;
ldinfo.export_defineds = export_defineds; ldinfo.auto_export_flags = auto_export_flags;
ldinfo.ldsym_count = 0; ldinfo.ldsym_count = 0;
ldinfo.string_size = 0; ldinfo.string_size = 0;
ldinfo.strings = NULL; ldinfo.strings = NULL;
@ -3328,6 +3394,13 @@ bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
if (info->fini_function != NULL if (info->fini_function != NULL
&& !xcoff_mark_symbol_by_name (info, info->fini_function, 0)) && !xcoff_mark_symbol_by_name (info, info->fini_function, 0))
goto error_return; 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_sweep (info);
xcoff_hash_table (info)->gc = TRUE; xcoff_hash_table (info)->gc = TRUE;
} }

View 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> 2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com>
* internal.h (C_AIX_WEAKEXT): New macro. * internal.h (C_AIX_WEAKEXT): New macro.

View File

@ -394,6 +394,9 @@ struct xcoff_link_hash_table
asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS]; 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 /* This structure is used to pass information through
xcoff_link_hash_traverse. */ xcoff_link_hash_traverse. */
@ -409,8 +412,8 @@ struct xcoff_loader_info
/* Link information structure. */ /* Link information structure. */
struct bfd_link_info *info; struct bfd_link_info *info;
/* Whether all defined symbols should be exported. */ /* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags. */
bfd_boolean export_defineds; unsigned int auto_export_flags;
/* Number of ldsym structures. */ /* Number of ldsym structures. */
size_t ldsym_count; size_t ldsym_count;

View 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> 2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com>
* emultempl/aix.em (gld${EMULATION_NAME}_handle_option): Make * emultempl/aix.em (gld${EMULATION_NAME}_handle_option): Make

View File

@ -84,6 +84,14 @@ static unsigned short modtype = ('1' << 8) | 'L';
permitted). */ permitted). */
static int textro; 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. */ /* Whether to implement Unix like linker semantics. */
static int unix_ld; static int unix_ld;
@ -156,6 +164,8 @@ enum
OPTION_AUTOIMP, OPTION_AUTOIMP,
OPTION_ERNOTOK, OPTION_ERNOTOK,
OPTION_EROK, OPTION_EROK,
OPTION_EXPALL,
OPTION_EXPFULL,
OPTION_EXPORT, OPTION_EXPORT,
OPTION_IMPORT, OPTION_IMPORT,
OPTION_INITFINI, OPTION_INITFINI,
@ -164,6 +174,8 @@ enum
OPTION_MAXSTACK, OPTION_MAXSTACK,
OPTION_MODTYPE, OPTION_MODTYPE,
OPTION_NOAUTOIMP, OPTION_NOAUTOIMP,
OPTION_NOEXPALL,
OPTION_NOEXPFULL,
OPTION_NOSTRCMPCT, OPTION_NOSTRCMPCT,
OPTION_PD, OPTION_PD,
OPTION_PT, OPTION_PT,
@ -201,6 +213,8 @@ gld${EMULATION_NAME}_add_options
{"bernotok", no_argument, NULL, OPTION_ERNOTOK}, {"bernotok", no_argument, NULL, OPTION_ERNOTOK},
{"berok", no_argument, NULL, OPTION_EROK}, {"berok", no_argument, NULL, OPTION_EROK},
{"berrmsg", no_argument, NULL, OPTION_IGNORE}, {"berrmsg", no_argument, NULL, OPTION_IGNORE},
{"bexpall", no_argument, NULL, OPTION_EXPALL},
{"bexpfull", no_argument, NULL, OPTION_EXPFULL},
{"bexport", required_argument, NULL, OPTION_EXPORT}, {"bexport", required_argument, NULL, OPTION_EXPORT},
{"bf", no_argument, NULL, OPTION_ERNOTOK}, {"bf", no_argument, NULL, OPTION_ERNOTOK},
{"bgc", no_argument, &gc, 1}, {"bgc", no_argument, &gc, 1},
@ -216,6 +230,8 @@ gld${EMULATION_NAME}_add_options
{"bM", required_argument, NULL, OPTION_MODTYPE}, {"bM", required_argument, NULL, OPTION_MODTYPE},
{"bmodtype", required_argument, NULL, OPTION_MODTYPE}, {"bmodtype", required_argument, NULL, OPTION_MODTYPE},
{"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP}, {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP},
{"bnoexpall", no_argument, NULL, OPTION_NOEXPALL},
{"bnoexpfull", no_argument, NULL, OPTION_NOEXPFULL},
{"bnodelcsect", no_argument, NULL, OPTION_IGNORE}, {"bnodelcsect", no_argument, NULL, OPTION_IGNORE},
{"bnoentry", no_argument, NULL, OPTION_IGNORE}, {"bnoentry", no_argument, NULL, OPTION_IGNORE},
{"bnogc", no_argument, &gc, 0}, {"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; link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
break; 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: case OPTION_EXPORT:
gld${EMULATION_NAME}_read_file (optarg, FALSE); gld${EMULATION_NAME}_read_file (optarg, FALSE);
break; break;
@ -444,6 +470,16 @@ gld${EMULATION_NAME}_handle_option (int optc)
link_info.static_link = TRUE; link_info.static_link = TRUE;
break; 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: case OPTION_NOSTRCMPCT:
link_info.traditional_format = TRUE; link_info.traditional_format = TRUE;
break; break;
@ -624,7 +660,7 @@ gld${EMULATION_NAME}_before_allocation (void)
".data", ".data",
".bss" ".bss"
}; };
unsigned int i; unsigned int i, flags;
/* Handle the import and export files, if any. */ /* Handle the import and export files, if any. */
for (fl = import_files; fl != NULL; fl = fl->next) 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. */ /* Let the XCOFF backend set up the .loader section. */
if (!bfd_xcoff_size_dynamic_sections if (!bfd_xcoff_size_dynamic_sections
(link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align, (link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align,
maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE, 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)) rtld ? TRUE : FALSE))
einfo ("%P%F: failed to set dynamic section sizes: %E\n"); einfo ("%P%F: failed to set dynamic section sizes: %E\n");

View 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> 2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com>
* ld-powerpc/aix-gc-1.s, ld-powerpc/aix-gc-1.ex, * ld-powerpc/aix-gc-1.s, ld-powerpc/aix-gc-1.ex,

View File

@ -0,0 +1,11 @@
.*
Disassembly of section \.data:
0*10000000 <main1>:
*10000000: 10 00 00 04 .*
0*10000004 <lib1>:
*10000004: 11 11 00 01 .*

View File

@ -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 .*

View File

@ -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

View File

@ -0,0 +1,9 @@
.globl main1
.csect main1[RW]
main1:
.long lib1
.globl _main2
.csect _main2[RW]
_main2:
.long _lib2

View 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}} {nm -D aix-no-dup-syms-1-dso.dnd} {objdump -R aix-no-dup-syms-1-dso.drd}}
"aix-no-dup-syms-1.so"} "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" {"Garbage collection test 1"
"-shared -binitfini:init_function:fini_function -bE:aix-gc-1.ex" "-shared -binitfini:init_function:fini_function -bE:aix-gc-1.ex"
"" {aix-gc-1.s} "" {aix-gc-1.s}