aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog4
-rw-r--r--bfd/bfd-in2.h23
-rw-r--r--bfd/section.c57
3 files changed, 79 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index cae9129..ab44781 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,9 @@
2000-09-05 Alan Modra <alan@linuxcare.com.au>
+ * section.c (SEC_HAS_GOT_REF): Define new flag for asection.
+ (bfd_get_unique_section_name): New function.
+ * bfd_in2.h: Regenerate.
+
* elf64-hppa.c (elf64_hppa_check_relocs): Handle R_PARISC_PCREL12F.
(elf64_hppa_size_dynamic_sections): Remove the FIXME at bfd_zalloc
comment.
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 688a40d..66081e8 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1008,6 +1008,14 @@ typedef struct sec
sections. */
#define SEC_COFF_SHARED_LIBRARY 0x800
+ /* The section has GOT references. This flag is only for the
+ linker, and is currently only used by the elf32-hppa back end.
+ It will be set if global offset table references were detected
+ in this section, which indicate to the linker that the section
+ contains PIC code, and must be handled specially when doing a
+ static link. */
+#define SEC_HAS_GOT_REF 0x4000
+
/* The section contains common symbols (symbols may be defined
multiple times, the value of a symbol is the amount of
space it requires, and the largest symbol value is the one
@@ -1274,6 +1282,11 @@ extern const struct symbol_cache_entry * const bfd_ind_symbol;
asection *
bfd_get_section_by_name PARAMS ((bfd *abfd, const char *name));
+char *
+bfd_get_unique_section_name PARAMS ((bfd *abfd,
+ const char *template,
+ int *count));
+
asection *
bfd_make_section_old_way PARAMS ((bfd *abfd, const char *name));
@@ -2024,11 +2037,6 @@ to compensate for the borrow when the low bits are added. */
BFD_RELOC_MIPS_GOT_PAGE,
BFD_RELOC_MIPS_GOT_OFST,
BFD_RELOC_MIPS_GOT_DISP,
- BFD_RELOC_SH_COPY,
- BFD_RELOC_SH_GLOB_DAT,
- BFD_RELOC_SH_JMP_SLOT,
- BFD_RELOC_SH_RELATIVE,
- BFD_RELOC_SH_GOTPC,
/* i386/elf relocations */
@@ -2167,6 +2175,11 @@ field in the instruction. */
BFD_RELOC_SH_LABEL,
BFD_RELOC_SH_LOOP_START,
BFD_RELOC_SH_LOOP_END,
+ BFD_RELOC_SH_COPY,
+ BFD_RELOC_SH_GLOB_DAT,
+ BFD_RELOC_SH_JMP_SLOT,
+ BFD_RELOC_SH_RELATIVE,
+ BFD_RELOC_SH_GOTPC,
/* Thumb 23-, 12- and 9-bit pc-relative branches. The lowest bit must
be zero and is not stored in the instruction. */
diff --git a/bfd/section.c b/bfd/section.c
index b9a39b6..69d80cf 100644
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -264,6 +264,14 @@ CODE_FRAGMENT
. sections. *}
.#define SEC_COFF_SHARED_LIBRARY 0x800
.
+. {* The section has GOT references. This flag is only for the
+. linker, and is currently only used by the elf32-hppa back end.
+. It will be set if global offset table references were detected
+. in this section, which indicate to the linker that the section
+. contains PIC code, and must be handled specially when doing a
+. static link. *}
+.#define SEC_HAS_GOT_REF 0x4000
+.
. {* The section contains common symbols (symbols may be defined
. multiple times, the value of a symbol is the amount of
. space it requires, and the largest symbol value is the one
@@ -637,6 +645,55 @@ bfd_get_section_by_name (abfd, name)
/*
FUNCTION
+ bfd_get_unique_section_name
+
+SYNOPSIS
+ char *bfd_get_unique_section_name(bfd *abfd,
+ const char *template,
+ int *count);
+
+DESCRIPTION
+ Invent a section name that is unique in @var{abfd} by tacking
+ a digit suffix onto the original @var{template}. If @var{count}
+ is non-NULL, then it specifies the first number tried as a
+ suffix to generate a unique name. The value pointed to by
+ @var{count} will be incremented in this case.
+*/
+
+char *
+bfd_get_unique_section_name (abfd, template, count)
+ bfd *abfd;
+ const char *template;
+ int *count;
+{
+ int num;
+ unsigned int len;
+ char *sname;
+
+ len = strlen (template);
+ sname = bfd_malloc (len + 7);
+ strcpy (sname, template);
+ num = 1;
+ if (count != NULL)
+ num = *count;
+
+ do
+ {
+ /* If we have a million sections, something is badly wrong. */
+ if (num > 999999)
+ abort ();
+ sprintf (sname + len, "%d", num++);
+ }
+ while (bfd_get_section_by_name (abfd, sname) != NULL);
+
+ if (count != NULL)
+ *count = num;
+ return sname;
+}
+
+
+/*
+FUNCTION
bfd_make_section_old_way
SYNOPSIS