* xcofflink.c (xcoff_link_add_symbols): Create the special

sections if we see a DYNAMIC object, in case that is the only
	XCOFF input object we see.
PR 8788.
This commit is contained in:
Ian Lance Taylor 1996-01-12 04:29:59 +00:00
parent f22d1530fc
commit c9746fb695
2 changed files with 43 additions and 12 deletions

View File

@ -13,6 +13,10 @@ Thu Jan 11 17:06:14 1996 Michael Meissner <meissner@tiktok.cygnus.com>
Thu Jan 11 11:23:30 1996 Ian Lance Taylor <ian@cygnus.com> Thu Jan 11 11:23:30 1996 Ian Lance Taylor <ian@cygnus.com>
* xcofflink.c (xcoff_link_add_symbols): Create the special
sections if we see a DYNAMIC object, in case that is the only
XCOFF input object we see.
* elf32-mips.c: Extensive changes for a start at dynamic linking * elf32-mips.c: Extensive changes for a start at dynamic linking
support, from Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp>. support, from Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp>.

View File

@ -953,18 +953,14 @@ xcoff_link_add_symbols (abfd, info)
if ((abfd->flags & DYNAMIC) != 0 if ((abfd->flags & DYNAMIC) != 0
&& ! info->static_link) && ! info->static_link)
return xcoff_link_add_dynamic_symbols (abfd, info); {
if (! xcoff_link_add_dynamic_symbols (abfd, info))
n_tmask = coff_data (abfd)->local_n_tmask; return false;
n_btshft = coff_data (abfd)->local_n_btshft; }
/* Define macros so that ISFCN, et. al., macros work correctly. */
#define N_TMASK n_tmask
#define N_BTSHFT n_btshft
/* We need to build a .loader section, so we do it here. This won't /* We need to build a .loader section, so we do it here. This won't
work if we're producing an XCOFF output file with no non dynamic work if we're producing an XCOFF output file with no XCOFF input
XCOFF input files. FIXME. */ files. FIXME. */
if (xcoff_hash_table (info)->loader_section == NULL) if (xcoff_hash_table (info)->loader_section == NULL)
{ {
asection *lsec; asection *lsec;
@ -1023,6 +1019,17 @@ xcoff_link_add_symbols (abfd, info)
dsec->flags |= SEC_HAS_CONTENTS | SEC_IN_MEMORY; dsec->flags |= SEC_HAS_CONTENTS | SEC_IN_MEMORY;
} }
if ((abfd->flags & DYNAMIC) != 0
&& ! info->static_link)
return true;
n_tmask = coff_data (abfd)->local_n_tmask;
n_btshft = coff_data (abfd)->local_n_btshft;
/* Define macros so that ISFCN, et. al., macros work correctly. */
#define N_TMASK n_tmask
#define N_BTSHFT n_btshft
if (info->keep_memory) if (info->keep_memory)
default_copy = false; default_copy = false;
else else
@ -2535,6 +2542,8 @@ struct xcoff_loader_info
bfd *output_bfd; bfd *output_bfd;
/* Link information structure. */ /* Link information structure. */
struct bfd_link_info *info; struct bfd_link_info *info;
/* Whether all defined symbols should be exported. */
boolean export_defineds;
/* Number of ldsym structures. */ /* Number of ldsym structures. */
size_t ldsym_count; size_t ldsym_count;
/* Size of string table. */ /* Size of string table. */
@ -2550,12 +2559,23 @@ struct xcoff_loader_info
.loader section before the linker lays out the output file. .loader section before the linker lays out the output file.
LIBPATH is the library path to search for shared objects; this is LIBPATH is the library path to search for shared objects; this is
normally built from the -L arguments passed to the linker. ENTRY normally built from the -L arguments passed to the linker. ENTRY
is the name of the entry point symbol. */ is the name of the entry point symbol (the -e linker option).
FILE_ALIGN is the alignment to use for sections within the file
(the -H linker option). MAXSTACK is the maximum stack size (the
-bmaxstack linker option). MAXDATA is the maximum data size (the
-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. */
boolean boolean
bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry, bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry,
file_align, maxstack, maxdata, gc, file_align, maxstack, maxdata, gc,
modtype, textro, special_sections) modtype, textro, export_defineds,
special_sections)
bfd *output_bfd; bfd *output_bfd;
struct bfd_link_info *info; struct bfd_link_info *info;
const char *libpath; const char *libpath;
@ -2566,6 +2586,7 @@ bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry,
boolean gc; boolean gc;
int modtype; int modtype;
boolean textro; boolean textro;
boolean export_defineds;
asection **special_sections; asection **special_sections;
{ {
struct xcoff_link_hash_entry *hentry; struct xcoff_link_hash_entry *hentry;
@ -2592,6 +2613,7 @@ bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry,
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.ldsym_count = 0; ldinfo.ldsym_count = 0;
ldinfo.string_size = 0; ldinfo.string_size = 0;
ldinfo.strings = NULL; ldinfo.strings = NULL;
@ -2902,6 +2924,11 @@ xcoff_build_ldsyms (h, p)
struct xcoff_loader_info *ldinfo = (struct xcoff_loader_info *) p; struct xcoff_loader_info *ldinfo = (struct xcoff_loader_info *) p;
size_t len; size_t len;
/* If all defined symbols should be exported, mark them now. */
if (ldinfo->export_defineds
&& (h->flags & XCOFF_DEF_REGULAR) != 0)
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. */
if (xcoff_hash_table (ldinfo->info)->gc if (xcoff_hash_table (ldinfo->info)->gc