+2016-05-10 Thomas Preud'homme <thomas.preudhomme@arm.com>
+
+ * bfd-in.h (elf32_arm_size_stubs): Add an output section parameter.
+ * bfd-in2.h: Regenerated.
+ * elf32-arm.c (struct elf32_arm_link_hash_table): Add an output section
+ parameter to add_stub_section callback.
+ (elf32_arm_create_or_find_stub_sec): Get output section from link_sec
+ and pass it down to add_stub_section.
+ (elf32_arm_add_stub): Set section to stub_sec if NULL before using it
+ for error message.
+ (elf32_arm_size_stubs): Add output section parameter to
+ add_stub_section function pointer parameter.
+
2016-05-10 Thomas Preud'homme <thomas.preudhomme@arm.com>
* elf32-arm.c (elf32_arm_create_stub): New function.
(struct bfd_link_info *, struct bfd_section *);
extern bfd_boolean elf32_arm_size_stubs
(bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
- struct bfd_section * (*) (const char *, struct bfd_section *, unsigned int),
+ struct bfd_section * (*) (const char *, struct bfd_section *,
+ struct bfd_section *, unsigned int),
void (*) (void));
extern bfd_boolean elf32_arm_build_stubs
(struct bfd_link_info *);
(struct bfd_link_info *, struct bfd_section *);
extern bfd_boolean elf32_arm_size_stubs
(bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
- struct bfd_section * (*) (const char *, struct bfd_section *, unsigned int),
+ struct bfd_section * (*) (const char *, struct bfd_section *,
+ struct bfd_section *, unsigned int),
void (*) (void));
extern bfd_boolean elf32_arm_build_stubs
(struct bfd_link_info *);
bfd *stub_bfd;
/* Linker call-backs. */
- asection * (*add_stub_section) (const char *, asection *, unsigned int);
+ asection * (*add_stub_section) (const char *, asection *, asection *,
+ unsigned int);
void (*layout_sections_again) (void);
/* Array to keep track of which stub sections have been created, and
{
asection *link_sec;
asection *stub_sec;
+ asection *out_sec;
link_sec = htab->stub_group[section->id].link_sec;
BFD_ASSERT (link_sec != NULL);
memcpy (s_name, link_sec->name, namelen);
memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
- stub_sec = (*htab->add_stub_section) (s_name, link_sec,
+ out_sec = link_sec->output_section;
+ stub_sec = (*htab->add_stub_section) (s_name, out_sec, link_sec,
htab->nacl_p ? 4 : 3);
if (stub_sec == NULL)
return NULL;
TRUE, FALSE);
if (stub_entry == NULL)
{
+ if (section == NULL)
+ section = stub_sec;
(*_bfd_error_handler) (_("%s: cannot create stub entry %s"),
section->owner,
stub_name);
struct bfd_link_info *info,
bfd_signed_vma group_size,
asection * (*add_stub_section) (const char *, asection *,
+ asection *,
unsigned int),
void (*layout_sections_again) (void))
{
+2016-05-10 Thomas Preud'homme <thomas.preudhomme@arm.com>
+
+ * emultempl/armelf.em (elf32_arm_add_stub_section): Add output_section
+ parameter and rename input_section parameter to after_input_section.
+ Append input stub section to the output section if after_input_section
+ is NULL.
+
2016-05-10 Thomas Preud'homme <thomas.preudhomme@arm.com>
* testsuite/ld-arm/arm-elf.exp (EABI attribute merging 10 (DSP)): New
static asection *
elf32_arm_add_stub_section (const char * stub_sec_name,
- asection * input_section,
+ asection * output_section,
+ asection * after_input_section,
unsigned int alignment_power)
{
asection *stub_sec;
flagword flags;
- asection *output_section;
lang_output_section_statement_type *os;
struct hook_stub_info info;
bfd_set_section_alignment (stub_file->the_bfd, stub_sec, alignment_power);
- output_section = input_section->output_section;
os = lang_output_section_get (output_section);
- info.input_section = input_section;
+ info.input_section = after_input_section;
lang_list_init (&info.add);
lang_add_section (&info.add, stub_sec, NULL, os);
if (info.add.head == NULL)
goto err_ret;
- if (hook_in_stub (&info, &os->children.head))
- return stub_sec;
+ if (after_input_section == NULL)
+ {
+ lang_statement_union_type **lp = &os->children.head;
+ lang_statement_union_type *l, *lprev = NULL;
+
+ for (; (l = *lp) != NULL; lp = &l->header.next, lprev = l);
+
+ if (lprev)
+ lprev->header.next = info.add.head;
+ else
+ os->children.head = info.add.head;
+
+ return stub_sec;
+ }
+ else
+ {
+ if (hook_in_stub (&info, &os->children.head))
+ return stub_sec;
+ }
err_ret:
einfo ("%X%P: can not make stub section: %E\n");