X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fmach-o.h;h=1db86746b9bb0b4ef402d36862bf4b52e6f34d33;hb=95830fd17d6ae253d8f6c2595188cadd59058799;hp=de9640a88026b2166aa2a2f3bfef89a819769d1b;hpb=46d1c23bceb2b8923af0d00a7f536a88524d6a74;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/mach-o.h b/bfd/mach-o.h index de9640a880..1db86746b9 100644 --- a/bfd/mach-o.h +++ b/bfd/mach-o.h @@ -1,5 +1,6 @@ /* Mach-O support for BFD. - Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008, 2009 + Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008, 2009, 2011, + 2012 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -41,11 +42,26 @@ typedef struct bfd_mach_o_header } bfd_mach_o_header; +typedef struct bfd_mach_o_asymbol +{ + /* The actual symbol which the rest of BFD works with. */ + asymbol symbol; + + /* Mach-O symbol fields. */ + unsigned char n_type; + unsigned char n_sect; + unsigned short n_desc; +} +bfd_mach_o_asymbol; + +#define BFD_MACH_O_SEGNAME_SIZE 16 +#define BFD_MACH_O_SECTNAME_SIZE 16 + typedef struct bfd_mach_o_section { /* Fields present in the file. */ - char sectname[16 + 1]; - char segname[16 + 1]; + char sectname[BFD_MACH_O_SECTNAME_SIZE + 1]; /* Always NUL padded. */ + char segname[BFD_MACH_O_SEGNAME_SIZE + 1]; bfd_vma addr; bfd_vma size; bfd_vma offset; @@ -59,12 +75,21 @@ typedef struct bfd_mach_o_section /* Corresponding bfd section. */ asection *bfdsection; + + /* An array holding the indirect symbols for this section. + NULL values indicate local symbols. + The number of symbols is determined from the section size and type. */ + + bfd_mach_o_asymbol **indirect_syms; + + /* Simply linked list. */ + struct bfd_mach_o_section *next; } bfd_mach_o_section; typedef struct bfd_mach_o_segment_command { - char segname[16 + 1]; + char segname[BFD_MACH_O_SEGNAME_SIZE + 1]; bfd_vma vmaddr; bfd_vma vmsize; bfd_vma fileoff; @@ -73,7 +98,10 @@ typedef struct bfd_mach_o_segment_command unsigned long initprot; /* Initial protection. */ unsigned long nsects; unsigned long flags; - bfd_mach_o_section *sections; + + /* Linked list of sections. */ + bfd_mach_o_section *sect_head; + bfd_mach_o_section *sect_tail; } bfd_mach_o_segment_command; @@ -95,17 +123,14 @@ typedef struct bfd_mach_o_reloc_info } bfd_mach_o_reloc_info; -typedef struct bfd_mach_o_asymbol -{ - /* The actual symbol which the rest of BFD works with. */ - asymbol symbol; - - /* Fields from Mach-O symbol. */ - unsigned char n_type; - unsigned char n_sect; - unsigned short n_desc; -} -bfd_mach_o_asymbol; +/* The symbol table is sorted like this: + (1) local. + (otherwise in order of generation) + (2) external defined + (sorted by name) + (3) external undefined / common + (sorted by name) +*/ typedef struct bfd_mach_o_symtab_command { @@ -429,10 +454,20 @@ typedef struct bfd_mach_o_str_command } bfd_mach_o_str_command; +typedef struct bfd_mach_o_fvmlib_command +{ + unsigned int name_offset; + unsigned int name_len; + char *name_str; + unsigned int minor_version; + unsigned int header_addr; +} +bfd_mach_o_fvmlib_command; + typedef struct bfd_mach_o_dyld_info_command { /* File offset and size to rebase info. */ - unsigned int rebase_off; + unsigned int rebase_off; unsigned int rebase_size; /* File offset and size of binding info. */ @@ -453,6 +488,40 @@ typedef struct bfd_mach_o_dyld_info_command } bfd_mach_o_dyld_info_command; +typedef struct bfd_mach_o_version_min_command +{ + unsigned char rel; + unsigned char maj; + unsigned char min; + unsigned int reserved; +} +bfd_mach_o_version_min_command; + +typedef struct bfd_mach_o_encryption_info_command +{ + unsigned int cryptoff; + unsigned int cryptsize; + unsigned int cryptid; +} +bfd_mach_o_encryption_info_command; + +typedef struct bfd_mach_o_main_command +{ + bfd_uint64_t entryoff; + bfd_uint64_t stacksize; +} +bfd_mach_o_main_command; + +typedef struct bfd_mach_o_source_version_command +{ + unsigned int a; + unsigned short b; + unsigned short c; + unsigned short d; + unsigned short e; +} +bfd_mach_o_source_version_command; + typedef struct bfd_mach_o_load_command { bfd_mach_o_load_command_type type; @@ -472,6 +541,11 @@ typedef struct bfd_mach_o_load_command bfd_mach_o_linkedit_command linkedit; bfd_mach_o_str_command str; bfd_mach_o_dyld_info_command dyld_info; + bfd_mach_o_version_min_command version_min; + bfd_mach_o_encryption_info_command encryption_info; + bfd_mach_o_fvmlib_command fvmlib; + bfd_mach_o_main_command main; + bfd_mach_o_source_version_command source_version; } command; } @@ -488,37 +562,45 @@ typedef struct mach_o_data_struct unsigned long nsects; bfd_mach_o_section **sections; - /* Used while writting: current length of the output file. This is used + /* Used while writing: current length of the output file. This is used to allocate space in the file. */ ufile_ptr filelen; /* As symtab is referenced by other load command, it is handy to have - a direct access to it. Also it is not clearly stated, only one symtab + a direct access to it. Although it is not clearly stated, only one symtab is expected. */ bfd_mach_o_symtab_command *symtab; bfd_mach_o_dysymtab_command *dysymtab; + + /* A place to stash dwarf2 info for this bfd. */ + void *dwarf2_find_line_info; + + /* BFD of .dSYM file. */ + bfd *dsym_bfd; + + /* Cache of dynamic relocs. */ + arelent *dyn_reloc_cache; } bfd_mach_o_data_struct; -/* Target specific routines. */ -typedef struct bfd_mach_o_backend_data +typedef struct bfd_mach_o_xlat_name { - enum bfd_architecture arch; - bfd_boolean (*_bfd_mach_o_swap_reloc_in)(arelent *, bfd_mach_o_reloc_info *); - bfd_boolean (*_bfd_mach_o_swap_reloc_out)(arelent *, bfd_mach_o_reloc_info *); - bfd_boolean (*_bfd_mach_o_print_thread)(bfd *, bfd_mach_o_thread_flavour *, - void *, char *); + const char *name; + unsigned long val; } -bfd_mach_o_backend_data; +bfd_mach_o_xlat_name; + +/* Target specific routines. */ #define bfd_mach_o_get_data(abfd) ((abfd)->tdata.mach_o_data) #define bfd_mach_o_get_backend_data(abfd) \ ((bfd_mach_o_backend_data*)(abfd)->xvec->backend_data) +/* Get the Mach-O header for section SEC. */ +#define bfd_mach_o_get_mach_o_section(sec) \ + ((bfd_mach_o_section *)(sec)->used_by_bfd) + bfd_boolean bfd_mach_o_valid (bfd *); -int bfd_mach_o_read_dysymtab_symbol (bfd *, bfd_mach_o_dysymtab_command *, bfd_mach_o_symtab_command *, bfd_mach_o_asymbol *, unsigned long); -int bfd_mach_o_scan_start_address (bfd *); -int bfd_mach_o_scan (bfd *, bfd_mach_o_header *, bfd_mach_o_data_struct *); bfd_boolean bfd_mach_o_mkobject_init (bfd *); const bfd_target *bfd_mach_o_object_p (bfd *); const bfd_target *bfd_mach_o_core_p (bfd *); @@ -526,14 +608,15 @@ const bfd_target *bfd_mach_o_archive_p (bfd *); bfd *bfd_mach_o_openr_next_archived_file (bfd *, bfd *); bfd_boolean bfd_mach_o_set_arch_mach (bfd *, enum bfd_architecture, unsigned long); -int bfd_mach_o_lookup_section (bfd *, asection *, bfd_mach_o_load_command **, bfd_mach_o_section **); int bfd_mach_o_lookup_command (bfd *, bfd_mach_o_load_command_type, bfd_mach_o_load_command **); +bfd_boolean bfd_mach_o_new_section_hook (bfd *, asection *); bfd_boolean bfd_mach_o_write_contents (bfd *); bfd_boolean bfd_mach_o_bfd_copy_private_symbol_data (bfd *, asymbol *, bfd *, asymbol *); bfd_boolean bfd_mach_o_bfd_copy_private_section_data (bfd *, asection *, bfd *, asection *); bfd_boolean bfd_mach_o_bfd_copy_private_bfd_data (bfd *, bfd *); +bfd_boolean bfd_mach_o_bfd_set_private_flags (bfd *, flagword); long bfd_mach_o_get_symtab_upper_bound (bfd *); long bfd_mach_o_canonicalize_symtab (bfd *, asymbol **); long bfd_mach_o_get_synthetic_symtab (bfd *, long, asymbol **, long, @@ -544,8 +627,7 @@ long bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *); long bfd_mach_o_canonicalize_dynamic_reloc (bfd *, arelent **, asymbol **); asymbol *bfd_mach_o_make_empty_symbol (bfd *); void bfd_mach_o_get_symbol_info (bfd *, asymbol *, symbol_info *); -void bfd_mach_o_print_symbol (bfd *, PTR, asymbol *, bfd_print_symbol_type); -bfd_boolean bfd_mach_o_bfd_print_private_bfd_data (bfd *, PTR); +void bfd_mach_o_print_symbol (bfd *, void *, asymbol *, bfd_print_symbol_type); int bfd_mach_o_sizeof_headers (bfd *, struct bfd_link_info *); unsigned long bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type); int bfd_mach_o_core_fetch_environment (bfd *, unsigned char **, unsigned int *); @@ -560,11 +642,70 @@ bfd_boolean bfd_mach_o_set_section_contents (bfd *, asection *, const void *, file_ptr, bfd_size_type); unsigned int bfd_mach_o_version (bfd *); -unsigned int bfd_mach_o_get_section_type_from_name (const char *); +unsigned int bfd_mach_o_get_section_type_from_name (bfd *, const char *); unsigned int bfd_mach_o_get_section_attribute_from_name (const char *); -void bfd_mach_o_normalize_section_name (const char *, const char *, - const char **, flagword *); + +void bfd_mach_o_convert_section_name_to_bfd (bfd *, const char *, const char *, + const char **, flagword *); +bfd_boolean bfd_mach_o_find_nearest_line (bfd *, asection *, asymbol **, + bfd_vma, const char **, + const char **, unsigned int *); +bfd_boolean bfd_mach_o_close_and_cleanup (bfd *); +bfd_boolean bfd_mach_o_free_cached_info (bfd *); + +unsigned int bfd_mach_o_section_get_nbr_indirect (bfd *, bfd_mach_o_section *); +unsigned int bfd_mach_o_section_get_entry_size (bfd *, bfd_mach_o_section *); +bfd_boolean bfd_mach_o_read_symtab_symbols (bfd *); +bfd_boolean bfd_mach_o_read_symtab_strtab (bfd *abfd); + +/* A placeholder in case we need to suppress emitting the dysymtab for some + reason (e.g. compatibility with older system versions). */ +#define bfd_mach_o_should_emit_dysymtab(x) TRUE + +extern const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[]; +extern const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[]; extern const bfd_target mach_o_fat_vec; +/* Interfaces between BFD names and Mach-O names. */ + +typedef struct mach_o_section_name_xlat +{ + const char *bfd_name; + const char *mach_o_name; + flagword bfd_flags; + unsigned int macho_sectype; + unsigned int macho_secattr; + unsigned int sectalign; +} mach_o_section_name_xlat; + +typedef struct mach_o_segment_name_xlat +{ + const char *segname; + const mach_o_section_name_xlat *sections; +} mach_o_segment_name_xlat; + +const mach_o_section_name_xlat * +bfd_mach_o_section_data_for_mach_sect (bfd *, const char *, const char *); +const mach_o_section_name_xlat * +bfd_mach_o_section_data_for_bfd_name (bfd *, const char *, const char **); + +typedef struct bfd_mach_o_backend_data +{ + enum bfd_architecture arch; + bfd_boolean (*_bfd_mach_o_swap_reloc_in)(arelent *, bfd_mach_o_reloc_info *); + bfd_boolean (*_bfd_mach_o_swap_reloc_out)(arelent *, bfd_mach_o_reloc_info *); + bfd_boolean (*_bfd_mach_o_print_thread)(bfd *, bfd_mach_o_thread_flavour *, + void *, char *); + const mach_o_segment_name_xlat *segsec_names_xlat; + bfd_boolean (*bfd_mach_o_section_type_valid_for_target) (unsigned long); +} +bfd_mach_o_backend_data; + +/* Values used in symbol.udata.i, to signal that the mach-o-specific data in the + symbol are not yet set, or need validation (where this is possible). */ + +#define SYM_MACHO_FIELDS_UNSET ((bfd_vma) -1) +#define SYM_MACHO_FIELDS_NOT_VALIDATED ((bfd_vma) -2) + #endif /* _BFD_MACH_O_H_ */