aboutsummaryrefslogtreecommitdiff
path: root/bfd/xcofflink.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1996-01-12 04:29:59 +0000
committerIan Lance Taylor <ian@airs.com>1996-01-12 04:29:59 +0000
commitc9746fb695adc5dc98cf3b2c14d36f2a7503ef6a (patch)
tree455b1d2085b83f7221a02189e4f6d5c39803dc4d /bfd/xcofflink.c
parentf22d1530fc1515a5818e21ff51af2249737b0dc9 (diff)
downloadgdb-c9746fb695adc5dc98cf3b2c14d36f2a7503ef6a.zip
gdb-c9746fb695adc5dc98cf3b2c14d36f2a7503ef6a.tar.gz
gdb-c9746fb695adc5dc98cf3b2c14d36f2a7503ef6a.tar.bz2
* 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.
Diffstat (limited to 'bfd/xcofflink.c')
-rw-r--r--bfd/xcofflink.c51
1 files changed, 39 insertions, 12 deletions
diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c
index 4936c3c..ba1829d 100644
--- a/bfd/xcofflink.c
+++ b/bfd/xcofflink.c
@@ -953,18 +953,14 @@ xcoff_link_add_symbols (abfd, info)
if ((abfd->flags & DYNAMIC) != 0
&& ! info->static_link)
- return xcoff_link_add_dynamic_symbols (abfd, info);
-
- 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 (! xcoff_link_add_dynamic_symbols (abfd, info))
+ return false;
+ }
/* 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
- XCOFF input files. FIXME. */
+ work if we're producing an XCOFF output file with no XCOFF input
+ files. FIXME. */
if (xcoff_hash_table (info)->loader_section == NULL)
{
asection *lsec;
@@ -1023,6 +1019,17 @@ xcoff_link_add_symbols (abfd, info)
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)
default_copy = false;
else
@@ -2535,6 +2542,8 @@ struct xcoff_loader_info
bfd *output_bfd;
/* Link information structure. */
struct bfd_link_info *info;
+ /* Whether all defined symbols should be exported. */
+ boolean export_defineds;
/* Number of ldsym structures. */
size_t ldsym_count;
/* Size of string table. */
@@ -2550,12 +2559,23 @@ struct xcoff_loader_info
.loader section before the linker lays out the output file.
LIBPATH is the library path to search for shared objects; this is
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
bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry,
file_align, maxstack, maxdata, gc,
- modtype, textro, special_sections)
+ modtype, textro, export_defineds,
+ special_sections)
bfd *output_bfd;
struct bfd_link_info *info;
const char *libpath;
@@ -2566,6 +2586,7 @@ bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry,
boolean gc;
int modtype;
boolean textro;
+ boolean export_defineds;
asection **special_sections;
{
struct xcoff_link_hash_entry *hentry;
@@ -2592,6 +2613,7 @@ bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry,
ldinfo.failed = false;
ldinfo.output_bfd = output_bfd;
ldinfo.info = info;
+ ldinfo.export_defineds = export_defineds;
ldinfo.ldsym_count = 0;
ldinfo.string_size = 0;
ldinfo.strings = NULL;
@@ -2902,6 +2924,11 @@ xcoff_build_ldsyms (h, p)
struct xcoff_loader_info *ldinfo = (struct xcoff_loader_info *) p;
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
XCOFF files. This is a convenient place to mark them. */
if (xcoff_hash_table (ldinfo->info)->gc