From c6a8f6e0ed6e27fff6f17d373d628fe3cce49345 Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Thu, 5 May 2011 16:05:19 +0000 Subject: [PATCH] bfd/ * elf32-tic6x.c (elf32_tic6x_final_link): New function. (elf32_tic6x_merge_attributes): Do not warn for PID or PIC mismatch. Choose the lower of the two values. (bfd_elf32_bfd_final_link): New macro. ld/testsuite/ * ld-tic6x/shared-nopic.d: New test. * ld-tic6x/shared-nopid.d: New test. * ld-tic6x/attr-pid-21.d: Don't expect a warning; check readelf output instead. * ld-tic6x/attr-pid-12.d: Likewise. * ld-tic6x/attr-pic-01.d: Likewise. * ld-tic6x/attr-pic-10.d: Likewise. * ld-tic6x/attr-pid-01.d: Likewise. * ld-tic6x/attr-pid-10.d: Likewise. * ld-tic6x/attr-pid-02.d: Likewise. * ld-tic6x/attr-pid-20.d: Likewise. * ld-tic6x/got-reloc-inrange.d: Pass -mpic and -mpid options to gas. --- bfd/ChangeLog | 7 ++++ bfd/elf32-tic6x.c | 47 +++++++++++++++-------- ld/testsuite/ChangeLog | 15 ++++++++ ld/testsuite/ld-tic6x/attr-pic-01.d | 6 ++- ld/testsuite/ld-tic6x/attr-pic-10.d | 6 ++- ld/testsuite/ld-tic6x/attr-pid-01.d | 7 +++- ld/testsuite/ld-tic6x/attr-pid-02.d | 7 +++- ld/testsuite/ld-tic6x/attr-pid-10.d | 7 +++- ld/testsuite/ld-tic6x/attr-pid-12.d | 8 +++- ld/testsuite/ld-tic6x/attr-pid-20.d | 6 ++- ld/testsuite/ld-tic6x/attr-pid-21.d | 7 +++- ld/testsuite/ld-tic6x/got-reloc-inrange.d | 2 +- ld/testsuite/ld-tic6x/shared-nopic.d | 5 +++ ld/testsuite/ld-tic6x/shared-nopid.d | 5 +++ 14 files changed, 109 insertions(+), 26 deletions(-) create mode 100644 ld/testsuite/ld-tic6x/shared-nopic.d create mode 100644 ld/testsuite/ld-tic6x/shared-nopid.d diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7af29f07a9..89547c0c59 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2011-05-05 Bernd Schmidt + + * elf32-tic6x.c (elf32_tic6x_final_link): New function. + (elf32_tic6x_merge_attributes): Do not warn for PID or PIC + mismatch. Choose the lower of the two values. + (bfd_elf32_bfd_final_link): New macro. + 2011-04-28 Tristan Gingold * coff-rs6000.c (_bfd_xcoff_swap_aux_in): Adjust for x_file. diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c index 8b5f5cb418..909225a5c3 100644 --- a/bfd/elf32-tic6x.c +++ b/bfd/elf32-tic6x.c @@ -1519,6 +1519,31 @@ elf32_tic6x_link_hash_table_create (bfd *abfd) return &ret->elf.root; } +static bfd_boolean +elf32_tic6x_final_link (bfd *abfd, struct bfd_link_info *info) +{ + if (info->shared) + { + obj_attribute *out_attr; + out_attr = elf_known_obj_attributes_proc (abfd); + if (out_attr[Tag_ABI_PIC].i == 0) + { + _bfd_error_handler (_("warning: generating a shared library " + "containing non-PIC code")); + } + if (out_attr[Tag_ABI_PID].i == 0) + { + _bfd_error_handler (_("warning: generating a shared library " + "containing non-PID code")); + } + } + /* Invoke the regular ELF backend linker to do all the work. */ + if (!bfd_elf_final_link (abfd, info)) + return FALSE; + + return TRUE; +} + /* Destroy a C6X ELF linker hash table. */ static void @@ -3764,24 +3789,10 @@ elf32_tic6x_merge_attributes (bfd *ibfd, bfd *obfd) } break; - case Tag_ABI_PID: - if (out_attr[i].i != in_attr[i].i) - { - _bfd_error_handler - (_("warning: %B and %B differ in position-dependence of " - "data addressing"), - obfd, ibfd); - } - break; - case Tag_ABI_PIC: - if (out_attr[i].i != in_attr[i].i) - { - _bfd_error_handler - (_("warning: %B and %B differ in position-dependence of " - "code addressing"), - obfd, ibfd); - } + case Tag_ABI_PID: + if (out_attr[i].i > in_attr[i].i) + out_attr[i].i = in_attr[i].i; break; case Tag_ABI_array_object_alignment: @@ -3944,6 +3955,8 @@ elf32_tic6x_copy_private_data (bfd * ibfd, bfd * obfd) elf32_tic6x_size_dynamic_sections #define elf_backend_finish_dynamic_sections \ elf32_tic6x_finish_dynamic_sections +#define bfd_elf32_bfd_final_link \ + elf32_tic6x_final_link #define elf_info_to_howto elf32_tic6x_info_to_howto #define elf_info_to_howto_rel elf32_tic6x_info_to_howto_rel diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 6433199d19..22783602c2 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,18 @@ +2011-05-05 Bernd Schmidt + + * ld-tic6x/shared-nopic.d: New test. + * ld-tic6x/shared-nopid.d: New test. + * ld-tic6x/attr-pid-21.d: Don't expect a warning; check readelf + output instead. + * ld-tic6x/attr-pid-12.d: Likewise. + * ld-tic6x/attr-pic-01.d: Likewise. + * ld-tic6x/attr-pic-10.d: Likewise. + * ld-tic6x/attr-pid-01.d: Likewise. + * ld-tic6x/attr-pid-10.d: Likewise. + * ld-tic6x/attr-pid-02.d: Likewise. + * ld-tic6x/attr-pid-20.d: Likewise. + * ld-tic6x/got-reloc-inrange.d: Pass -mpic and -mpid options to gas. + 2011-05-03 Paul Brook diff --git a/ld/testsuite/ld-tic6x/attr-pic-01.d b/ld/testsuite/ld-tic6x/attr-pic-01.d index a04713f8b7..91fb599172 100644 --- a/ld/testsuite/ld-tic6x/attr-pic-01.d +++ b/ld/testsuite/ld-tic6x/attr-pic-01.d @@ -3,4 +3,8 @@ #ld: -r -melf32_tic6x_le #source: attr-pic-0.s #source: attr-pic-1.s -#warning: .*differ in position-dependence of code addressing +#readelf: -A + +Attribute Section: c6xabi +File Attributes + Tag_ISA: C674x diff --git a/ld/testsuite/ld-tic6x/attr-pic-10.d b/ld/testsuite/ld-tic6x/attr-pic-10.d index bc781c4b78..ff52a7ac17 100644 --- a/ld/testsuite/ld-tic6x/attr-pic-10.d +++ b/ld/testsuite/ld-tic6x/attr-pic-10.d @@ -3,4 +3,8 @@ #ld: -r -melf32_tic6x_le #source: attr-pic-1.s #source: attr-pic-0.s -#warning: .*differ in position-dependence of code addressing +#readelf: -A + +Attribute Section: c6xabi +File Attributes + Tag_ISA: C674x diff --git a/ld/testsuite/ld-tic6x/attr-pid-01.d b/ld/testsuite/ld-tic6x/attr-pid-01.d index 5c32e15b9c..a5449dcd63 100644 --- a/ld/testsuite/ld-tic6x/attr-pid-01.d +++ b/ld/testsuite/ld-tic6x/attr-pid-01.d @@ -3,4 +3,9 @@ #ld: -r -melf32_tic6x_le #source: attr-pid-0.s #source: attr-pid-1.s -#warning: .*differ in position-dependence of data addressing +#readelf: -A + +Attribute Section: c6xabi +File Attributes + Tag_ISA: C674x + diff --git a/ld/testsuite/ld-tic6x/attr-pid-02.d b/ld/testsuite/ld-tic6x/attr-pid-02.d index d155b56157..2a7bfd1ef6 100644 --- a/ld/testsuite/ld-tic6x/attr-pid-02.d +++ b/ld/testsuite/ld-tic6x/attr-pid-02.d @@ -3,4 +3,9 @@ #ld: -r -melf32_tic6x_le #source: attr-pid-0.s #source: attr-pid-2.s -#warning: .*differ in position-dependence of data addressing +#readelf: -A + +Attribute Section: c6xabi +File Attributes + Tag_ISA: C674x + diff --git a/ld/testsuite/ld-tic6x/attr-pid-10.d b/ld/testsuite/ld-tic6x/attr-pid-10.d index edb8a659cf..a421d40321 100644 --- a/ld/testsuite/ld-tic6x/attr-pid-10.d +++ b/ld/testsuite/ld-tic6x/attr-pid-10.d @@ -3,4 +3,9 @@ #ld: -r -melf32_tic6x_le #source: attr-pid-1.s #source: attr-pid-0.s -#warning: .*differ in position-dependence of data addressing +#readelf: -A + +Attribute Section: c6xabi +File Attributes + Tag_ISA: C674x + diff --git a/ld/testsuite/ld-tic6x/attr-pid-12.d b/ld/testsuite/ld-tic6x/attr-pid-12.d index 138ae8889a..af7a76599e 100644 --- a/ld/testsuite/ld-tic6x/attr-pid-12.d +++ b/ld/testsuite/ld-tic6x/attr-pid-12.d @@ -3,4 +3,10 @@ #ld: -r -melf32_tic6x_le #source: attr-pid-1.s #source: attr-pid-2.s -#warning: .*differ in position-dependence of data addressing +#readelf: -A + +Attribute Section: c6xabi +File Attributes + Tag_ISA: C674x + Tag_ABI_PID: Data addressing position-independent, GOT near DP + diff --git a/ld/testsuite/ld-tic6x/attr-pid-20.d b/ld/testsuite/ld-tic6x/attr-pid-20.d index ce319bd617..e2cd0bc299 100644 --- a/ld/testsuite/ld-tic6x/attr-pid-20.d +++ b/ld/testsuite/ld-tic6x/attr-pid-20.d @@ -3,4 +3,8 @@ #ld: -r -melf32_tic6x_le #source: attr-pid-2.s #source: attr-pid-0.s -#warning: .*differ in position-dependence of data addressing +#readelf: -A + +Attribute Section: c6xabi +File Attributes + Tag_ISA: C674x diff --git a/ld/testsuite/ld-tic6x/attr-pid-21.d b/ld/testsuite/ld-tic6x/attr-pid-21.d index 7097db6757..c0f71df9cc 100644 --- a/ld/testsuite/ld-tic6x/attr-pid-21.d +++ b/ld/testsuite/ld-tic6x/attr-pid-21.d @@ -3,4 +3,9 @@ #ld: -r -melf32_tic6x_le #source: attr-pid-2.s #source: attr-pid-1.s -#warning: .*differ in position-dependence of data addressing +#readelf: -A + +Attribute Section: c6xabi +File Attributes + Tag_ISA: C674x + Tag_ABI_PID: Data addressing position-independent, GOT near DP diff --git a/ld/testsuite/ld-tic6x/got-reloc-inrange.d b/ld/testsuite/ld-tic6x/got-reloc-inrange.d index e4fed04aac..4260444fd4 100644 --- a/ld/testsuite/ld-tic6x/got-reloc-inrange.d +++ b/ld/testsuite/ld-tic6x/got-reloc-inrange.d @@ -1,5 +1,5 @@ #name: C6X GOT relocations, no overflow -#as: -mlittle-endian -mdsbt +#as: -mlittle-endian -mdsbt -mpic -mpid=near #ld: -melf32_tic6x_le -Tdsbt-inrange.ld --dsbt-index 4 -shared #source: got-reloc-global.s #objdump: -dr diff --git a/ld/testsuite/ld-tic6x/shared-nopic.d b/ld/testsuite/ld-tic6x/shared-nopic.d new file mode 100644 index 0000000000..8748f1091c --- /dev/null +++ b/ld/testsuite/ld-tic6x/shared-nopic.d @@ -0,0 +1,5 @@ +#name: C6X shared library without PIC code +#as: -mlittle-endian -mdsbt -mpid=near +#ld: -melf32_tic6x_le -Tdsbt-inrange.ld --dsbt-index 4 -shared +#source: got-reloc-global.s +#warning: non-PIC code diff --git a/ld/testsuite/ld-tic6x/shared-nopid.d b/ld/testsuite/ld-tic6x/shared-nopid.d new file mode 100644 index 0000000000..7f366f3f6f --- /dev/null +++ b/ld/testsuite/ld-tic6x/shared-nopid.d @@ -0,0 +1,5 @@ +#name: C6X shared library without PIC code +#as: -mlittle-endian -mdsbt -mpic +#ld: -melf32_tic6x_le -Tdsbt-inrange.ld --dsbt-index 4 -shared +#source: got-reloc-global.s +#warning: non-PID code