diff options
author | Alan Modra <amodra@gmail.com> | 2009-09-23 13:54:29 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2009-09-23 13:54:29 +0000 |
commit | 7ee314faa48ba637641861e0288736cb4666f940 (patch) | |
tree | 20e03cb7130dc65e3ad2e741cffd98153f2adb71 /bfd | |
parent | 8a00d39205398a858642a2c727bd2a54d8e49b46 (diff) | |
download | gdb-7ee314faa48ba637641861e0288736cb4666f940.zip gdb-7ee314faa48ba637641861e0288736cb4666f940.tar.gz gdb-7ee314faa48ba637641861e0288736cb4666f940.tar.bz2 |
bfd/
* bfd-in.h (bfd_elf_size_dynamic_sections): Add audit and depaudit
arguments.
* elflink.c (bfd_elf_size_dynamic_sections): Generate DT_AUDIT,
DT_DEPAUDIT from audit/depaudit arguments.
(elf_finalize_dynstr): Finalize DT_AUDIT and DT_DEPAUDIT strtab entries.
(elf_link_add_object_symbols): Set dt_audit target data when finding a
DT_AUDIT.
* bfd-in2.h: Regenerate.
* bfd-elf.h: Add dt_audit to elf_obj_tdata, and elf_dt_audit macro.
ld/
* emultempl/elf32.em (gld${EMULATION_NAME}_add_options): Add --audit,
--depaudit, and -P options.
(gld${EULATION_NAME}_handle_options): Ditto.
(gld${EULATION_NAME}_list_options): Ditto.
(gld${EMULATION_NAME}_append_to_separated_string): New function for
handling rpath-like colon separated strings.
(gld${EMULATION_NAME}_before_allocation): Pass the audit and depaudit
libs to bfd. Propagate DT_AUDIT from needed libs to depaudit.
* ld.texinfo: Document new options.
ld/testsuite/
* ld-elf/audit.exp: New.
* ld-elf/audit.rd: New.
* ld-elf/depaudit.rd: New.
* ld-elf/depaudit2.rd: New.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 26 | ||||
-rw-r--r-- | bfd/bfd-in.h | 4 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 4 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 5 | ||||
-rw-r--r-- | bfd/elflink.c | 35 |
5 files changed, 63 insertions, 11 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 09194ce..8e108ac 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2009-09-23 Matt Rice <ratmice@gmail.com> + + * bfd-in.h (bfd_elf_size_dynamic_sections): Add audit and depaudit + arguments. + * elflink.c (bfd_elf_size_dynamic_sections): Generate DT_AUDIT, + DT_DEPAUDIT from audit/depaudit arguments. + (elf_finalize_dynstr): Finalize DT_AUDIT and DT_DEPAUDIT strtab entries. + (elf_link_add_object_symbols): Set dt_audit target data when finding a + DT_AUDIT. + * bfd-in2.h: Regenerate. + * bfd-elf.h: Add dt_audit to elf_obj_tdata, and elf_dt_audit macro. + 2009-09-23 Jie Zhang <jie.zhang@analog.com> * elf32-bfin.c (_bfinfdpic_size_got_plt): Make sure empty @@ -110,7 +122,7 @@ assignments in test. 2009-09-16 Tristan Gingold <gingold@adacore.com> - + * mach-o.h (bfd_mach_o_filetype): Add new constants from darwin10. Reindent. * mach-o.c (bfd_mach_o_cpu_name): Reindent. @@ -625,7 +637,7 @@ bfinfdpic_gc_sweep_hook, bfinfdpic_check_relocs, bfin_finish_dynamic_symbol, bfd_bfin_elf32_create_embedded_relocs): Adjust to match the renamed reloc definitions. - + 2009-08-08 Alan Modra <amodra@bigpond.net.au> PR 10494 @@ -1146,7 +1158,7 @@ (bfd_mach_o_print_thread): Define. * mach-o.c (text_section_names_xlat): Add an entry for __const. - (bfd_mach_o_canonicalize_one_reloc, bfd_mach_o_canonicalize_relocs): + (bfd_mach_o_canonicalize_one_reloc, bfd_mach_o_canonicalize_relocs): New functions extracted from ... (bfd_mach_o_canonicalize_reloc): ... This. Simplified. (bfd_mach_o_get_dynamic_reloc_upper_bound): New function. @@ -1793,7 +1805,7 @@ (bfd_mach_o_scan_read_dysymtab_symbol): Ditto. (bfd_mach_o_get_reloc_upper_bound): New prototype. (bfd_mach_o_canonicalize_reloc): Ditto. - + * mach-o-target.c (bfd_mach_o_bfd_is_local_label_name): Remove duplicated macro. Now defined to _bfd_generic_is_local_label. (TARGET_NAME_BACKEND): New macro... @@ -1830,15 +1842,15 @@ Clean up copyright notice. 2009-06-10 Paul Pluzhnikov <ppluzhnikov@google.com> - + * bfd-in2.h: bfd_mmap prototype. * bfdio.c (bfd_mmap): New function. * libbfd.h (bfd_iovec): Add bmmap. * cache.c (cache_bmmap): New function. (cache_iovec): Initialize bmmap member. * opencls.c (opncls_bmmap): New function. - (opncls_iovec): Initialize bmmap member. - + (opncls_iovec): Initialize bmmap member. + 2009-06-09 Tristan Gingold <gingold@adacore.com> * mach-o.h (bfd_mach_o_symtab_command): Remove stabs_segment diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 516102e..c3d2d97 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -635,8 +635,8 @@ extern struct bfd_link_needed_list *bfd_elf_get_needed_list extern bfd_boolean bfd_elf_get_bfd_needed_list (bfd *, struct bfd_link_needed_list **); extern bfd_boolean bfd_elf_size_dynamic_sections - (bfd *, const char *, const char *, const char *, const char * const *, - struct bfd_link_info *, struct bfd_section **, + (bfd *, const char *, const char *, const char *, const char *, const char *, + const char * const *, struct bfd_link_info *, struct bfd_section **, struct bfd_elf_version_tree *); extern bfd_boolean bfd_elf_size_dynsym_hash_dynstr (bfd *, struct bfd_link_info *); diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 40d3b7a..b5fceb7 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -642,8 +642,8 @@ extern struct bfd_link_needed_list *bfd_elf_get_needed_list extern bfd_boolean bfd_elf_get_bfd_needed_list (bfd *, struct bfd_link_needed_list **); extern bfd_boolean bfd_elf_size_dynamic_sections - (bfd *, const char *, const char *, const char *, const char * const *, - struct bfd_link_info *, struct bfd_section **, + (bfd *, const char *, const char *, const char *, const char *, const char *, + const char * const *, struct bfd_link_info *, struct bfd_section **, struct bfd_elf_version_tree *); extern bfd_boolean bfd_elf_size_dynsym_hash_dynstr (bfd *, struct bfd_link_info *); diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 3f2d528..7cc420c 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1503,6 +1503,10 @@ struct elf_obj_tdata one. */ const char *dt_name; + /* The linker emulation needs to know what audit libs + are used by a dynamic object. */ + const char *dt_audit; + /* Records the result of `get_program_header_size'. */ bfd_size_type program_header_size; @@ -1632,6 +1636,7 @@ struct elf_obj_tdata #define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got.offsets) #define elf_local_got_ents(bfd) (elf_tdata(bfd) -> local_got.ents) #define elf_dt_name(bfd) (elf_tdata(bfd) -> dt_name) +#define elf_dt_audit(bfd) (elf_tdata(bfd) -> dt_audit) #define elf_dyn_lib_class(bfd) (elf_tdata(bfd) -> dyn_lib_class) #define elf_bad_symtab(bfd) (elf_tdata(bfd) -> bad_symtab) #define elf_flags_init(bfd) (elf_tdata(bfd) -> flags_init) diff --git a/bfd/elflink.c b/bfd/elflink.c index c42c6e1..b99acea 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -3234,6 +3234,8 @@ elf_finalize_dynstr (bfd *output_bfd, struct bfd_link_info *info) case DT_RUNPATH: case DT_FILTER: case DT_AUXILIARY: + case DT_AUDIT: + case DT_DEPAUDIT: dyn.d_un.d_val = _bfd_elf_strtab_offset (dynstr, dyn.d_un.d_val); break; default: @@ -3525,6 +3527,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) { asection *s; const char *soname = NULL; + char *audit = NULL; struct bfd_link_needed_list *rpath = NULL, *runpath = NULL; int ret; @@ -3653,6 +3656,11 @@ error_free_dyn: ; *pn = n; } + if (dyn.d_tag == DT_AUDIT) + { + unsigned int tagv = dyn.d_un.d_val; + audit = bfd_elf_string_from_elf_section (abfd, shlink, tagv); + } } free (dynbuf); @@ -3705,6 +3713,9 @@ error_free_dyn: particular dynamic object more than once. */ if (ret > 0) return TRUE; + + /* Save the DT_AUDIT entry for the linker emulation code. */ + elf_dt_audit (abfd) = audit; } /* If this is a dynamic object, we always link against the .dynsym @@ -5451,6 +5462,8 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, const char *soname, const char *rpath, const char *filter_shlib, + const char *audit, + const char *depaudit, const char * const *auxiliary_filters, struct bfd_link_info *info, asection **sinterpptr, @@ -5603,6 +5616,28 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, } } + if (audit != NULL) + { + bfd_size_type indx; + + indx = _bfd_elf_strtab_add (elf_hash_table (info)->dynstr, audit, + TRUE); + if (indx == (bfd_size_type) -1 + || !_bfd_elf_add_dynamic_entry (info, DT_AUDIT, indx)) + return FALSE; + } + + if (depaudit != NULL) + { + bfd_size_type indx; + + indx = _bfd_elf_strtab_add (elf_hash_table (info)->dynstr, depaudit, + TRUE); + if (indx == (bfd_size_type) -1 + || !_bfd_elf_add_dynamic_entry (info, DT_DEPAUDIT, indx)) + return FALSE; + } + eif.info = info; eif.verdefs = verdefs; eif.failed = FALSE; |