public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [Patch] Mach-O: add write capability
@ 2009-06-02 14:41 Tristan Gingold
  2009-06-05 21:21 ` Jan Kratochvil
  0 siblings, 1 reply; 4+ messages in thread
From: Tristan Gingold @ 2009-06-02 14:41 UTC (permalink / raw)
  To: Binutils

Hi,

the Mach-O bfd back-end was mostly a read-only back-end - which is  
still very useful but somewhat incomplete.

This patch starts to add write capability.  Far from being complete  
but I was at least able to objcopy
from binary to Mach-O or from Mach-O object file to Mach-O object file.

Also until now there was only 2 generic targets.  I added an i386  
targets, others (x86-64, ppc and ppc64)
will come later.

I have also replaced some hard-coded values with constants.

I plan also to port gas to Mach-O as this will be useful to run the  
testsuite.

I did some manual checks to test this new feature.

Tristan.

bfd/
2009-06-02  Tristan Gingold  <gingold@adacore.com>

	* mach-o.h: Update copyright year.
	(bfd_mach_o_mach_header_magic): New enum.
	(bfd_mach_o_cpu_subtype): Now an enum.
	(BFD_MACH_O_HEADER_SIZE, BFD_MACH_O_HEADER_64_SIZE): New macros.
	(BFD_MACH_O_SECTION_SIZE, BFD_MACH_O_SECTION_64_SIZE): Ditto.
	(BFD_MACH_O_LC_SEGMENT_SIZE, BFD_MACH_O_LC_SEGMENT_64_SIZE): Ditto.
	(bfd_mach_o_load_command): Field type_required is now a boolean.
	Reindent prototypes.
	(bfd_mach_o_object_p, bfd_mach_o_core_p): Remove.
	(bfd_mach_o_bfd_copy_private_symbol_data): Add a prototype.
	(bfd_mach_o_bfd_copy_private_section_data): Ditto.
	(bfd_mach_o_bfd_copy_private_bfd_data): Ditto.
	(bfd_mach_o_get_symtab_upper_bound): Ditto.
	(bfd_mach_o_canonicalize_symtab): Ditto.
	(bfd_mach_o_get_symbol_info): Ditto.
	(bfd_mach_o_print_symbol): Ditto.
	(bfd_mach_o_bfd_print_private_bfd_data): Ditto.
	(bfd_mach_o_make_empty_symbol): Ditto.
	(bfd_mach_o_write_contents): Ditto.

	* mach-o.c (bfd_mach_o_object_p, bfd_mach_o_core_p,
	bfd_mach_o_mkobject): Defines.
	(bfd_mach_o_valid): Returns FALSE/TRUE instead of 0/1.
	Do not check with target vector but with flavour.
	(struct mach_o_section_name_xlat): New declaration.
	(dwarf_section_names_xlat): Ditto.
	(text_section_names_xlat): Ditto.
	(data_section_names_xlat): Ditto.
	(struct mach_o_segment_name_xlat): Ditto.
	(segsec_names_xlat): Ditto.
	(bfd_mach_o_convert_section_name_to_bfd): New function.
	(bfd_mach_o_convert_section_name_to_mach_o): Ditto.
	(bfd_mach_o_bfd_copy_private_symbol_data): Make it public.
	(bfd_mach_o_bfd_copy_private_section_data): Ditto.
	(bfd_mach_o_bfd_copy_private_bfd_data): Ditto.
	Accept any input and output flavour.  Do not share private data
	anymore.
	(bfd_mach_o_count_symbols): Add a comment.
	(bfd_mach_o_get_symtab_upper_bound): Make it public.
	(bfd_mach_o_canonicalize_symtab): Ditto.
	(bfd_mach_o_get_symbol_info): Ditto.
	(bfd_mach_o_print_symbol): Ditto.
	(bfd_mach_o_write_header): Now returns a boolean instead of an int.
	Use constants instead of hard-coded values.
	(bfd_mach_o_scan_write_section_32): Use constants instead of hard-coded
	values.
	(bfd_mach_o_scan_write_section_64): Ditto.
	(bfd_mach_o_scan_write_segment): Ditto.
	Do not copy sections anymore.
	(bfd_mach_o_write_contents): Make it public.
	Remove dead code.  Rewrite typeflag assignment.
	(bfd_mach_o_build_commands): New function.
	(bfd_mach_o_set_section_contents): Ditto.
	(bfd_mach_o_make_empty_symbol): Make it public.
	(bfd_mach_o_read_header): Make it static.
	Convert to bfd_boolean.
	Use constants instead of hard-coded values.
	(bfd_mach_o_make_bfd_section): Call
	bfd_mach_o_convert_section_name_to_bfd to create name.
	(bfd_mach_o_scan_read_section_32): Use constants instead of hard-coded
	values.
	(bfd_mach_o_scan_read_section_64): Ditto.
	(bfd_mach_o_scan_read_segment): Do not create a bfd section for
	a segment anymore.  Use constants instead of hard-coded values.
	(bfd_mach_o_scan_read_command): Fix style.
	(bfd_mach_o_scan): Use constants instead of hard-coded values.
	Get rid of BFD_IO_FUNCS.
	(bfd_mach_o_mkobject_init): Renamed from bfd_mach_o_mkobject.
	(bfd_mach_o_header_p): Created from bfd_mach_o_object_p.
	(bfd_mach_o_gen_object_p): New function, replaces bfd_mach_o_object_p.
	(bfd_mach_o_object_p): Removed.
	(bfd_mach_o_gen_core_p): New function, replaces ...
	(bfd_mach_o_core_p): ... deleted.
	(bfd_mach_o_bfd_print_private_bfd_data): Make it public.

	* mach-o-i386.c: New file.
	* config.bfd: Use mach_o_i386_vec as targ_defvec for ix86-darwin.
	* configure.in (TDEFINES): Add mach_o_i386_vec.
	* configure: Regenerates.
	* targets.c: Add mach_o_i386_vec.

	* mach-o.c: Update copyright years.
	(BFD_IO_FUNCS): Remove (was not used).
	(bfd_mach_o_mkarchive, bfd_mach_o_read_ar_hdr, bfd_mach_o_slurp_armap
	bfd_mach_o_slurp_extended_name_table,
	bfd_mach_o_construct_extended_name_table,
	bfd_mach_o_truncate_arname, bfd_mach_o_write_armap,
	bfd_mach_o_get_elt_at_index, bfd_mach_o_generic_stat_arch_elt,
	bfd_mach_o_update_armap_timestamp, bfd_mach_o_close_and_cleanup,
	bfd_mach_o_bfd_free_cached_info, bfd_mach_o_new_section_hook,
	bfd_mach_o_get_section_contents_in_window,
	bfd_mach_o_bfd_is_local_label_name,
	bfd_mach_o_bfd_is_target_special_symbol,
	bfd_mach_o_bfd_is_local_label_name, bfd_mach_o_get_lineno,
	bfd_mach_o_find_nearest_line, bfd_mach_o_find_inliner_info,
	bfd_mach_o_bfd_make_debug_symbol, bfd_mach_o_read_minisymbols,
	bfd_mach_o_minisymbol_to_symbol,
	bfd_mach_o_bfd_get_relocated_section_contents,
	bfd_mach_o_bfd_relax_section, bfd_mach_o_bfd_link_hash_table_create,
	bfd_mach_o_bfd_link_hash_table_free, bfd_mach_o_bfd_link_add_symbols,
	bfd_mach_o_bfd_link_just_syms, bfd_mach_o_bfd_final_link,
	bfd_mach_o_bfd_link_split_section, bfd_mach_o_set_arch_mach,
	bfd_mach_o_bfd_merge_private_bfd_data,
	bfd_mach_o_bfd_set_private_flags, bfd_mach_o_get_section_contents,
	bfd_mach_o_bfd_gc_sections, bfd_mach_o_bfd_merge_sections,
	bfd_mach_o_bfd_is_group_section, bfd_mach_o_bfd_discard_group,
	bfd_mach_o_section_already_linked, bfd_mach_o_bfd_define_common_symbol,
	bfd_mach_o_bfd_copy_private_header_data,
	bfd_mach_o_core_file_matches_executable_p): Move these defines ...
	* mach-o-target.c: ... here.
	Update copyright years.

Index: config.bfd
===================================================================
RCS file: /cvs/src/src/bfd/config.bfd,v
retrieving revision 1.249
diff -c -p -r1.249 config.bfd
*** config.bfd	26 May 2009 14:12:02 -0000	1.249
--- config.bfd	2 Jun 2009 14:26:10 -0000
*************** case "${targ}" in
*** 541,548 ****
       targ_selvecs="i386coff_vec i386aout_vec"
       ;;
     i[3-7]86-*-darwin* | i[3-7]86-*-macos10* | i[3-7]86-*-rhapsody*)
!     targ_defvec=mach_o_le_vec
!     targ_selvecs="mach_o_le_vec mach_o_be_vec mach_o_fat_vec pef_vec  
pef_xlib_vec sym_vec"
       targ_archs="bfd_i386_arch bfd_powerpc_arch bfd_rs6000_arch"
       ;;
    i[3-7]86-sequent-bsd*)
--- 541,548 ----
       targ_selvecs="i386coff_vec i386aout_vec"
       ;;
     i[3-7]86-*-darwin* | i[3-7]86-*-macos10* | i[3-7]86-*-rhapsody*)
!     targ_defvec=mach_o_i386_vec
!     targ_selvecs="mach_o_i386_vec mach_o_le_vec mach_o_be_vec  
mach_o_fat_vec pef_vec pef_xlib_vec sym_vec"
       targ_archs="bfd_i386_arch bfd_powerpc_arch bfd_rs6000_arch"
       ;;
    i[3-7]86-sequent-bsd*)
Index: configure
===================================================================
RCS file: /cvs/src/src/bfd/configure,v
retrieving revision 1.303
diff -c -p -r1.303 configure
*** configure	27 May 2009 16:29:55 -0000	1.303
--- configure	2 Jun 2009 14:26:14 -0000
*************** do
*** 21171,21176 ****
--- 21171,21177 ----
       mach_o_be_vec)              tb="$tb mach-o.lo" ;;
       mach_o_le_vec)              tb="$tb mach-o.lo" ;;
       mach_o_fat_vec)             tb="$tb mach-o.lo" ;;
+     mach_o_i386_vec)            tb="$tb mach-o-i386.lo" ;;
       mcore_pe_big_vec)		tb="$tb pe-mcore.lo peigen.lo cofflink.lo" ;;
       mcore_pe_little_vec)	tb="$tb pe-mcore.lo peigen.lo  
cofflink.lo" ;;
       mcore_pei_big_vec)		tb="$tb pei-mcore.lo peigen.lo  
cofflink.lo" ;;
Index: configure.in
===================================================================
RCS file: /cvs/src/src/bfd/configure.in,v
retrieving revision 1.262
diff -c -p -r1.262 configure.in
*** configure.in	27 May 2009 16:29:55 -0000	1.262
--- configure.in	2 Jun 2009 14:26:14 -0000
*************** do
*** 868,873 ****
--- 868,874 ----
       mach_o_be_vec)              tb="$tb mach-o.lo" ;;
       mach_o_le_vec)              tb="$tb mach-o.lo" ;;
       mach_o_fat_vec)             tb="$tb mach-o.lo" ;;
+     mach_o_i386_vec)            tb="$tb mach-o-i386.lo" ;;
       mcore_pe_big_vec)		tb="$tb pe-mcore.lo peigen.lo cofflink.lo" ;;
       mcore_pe_little_vec)	tb="$tb pe-mcore.lo peigen.lo  
cofflink.lo" ;;
       mcore_pei_big_vec)		tb="$tb pei-mcore.lo peigen.lo  
cofflink.lo" ;;
Index: mach-o-target.c
===================================================================
RCS file: /cvs/src/src/bfd/mach-o-target.c,v
retrieving revision 1.6
diff -c -p -r1.6 mach-o-target.c
*** mach-o-target.c	6 Nov 2008 13:03:43 -0000	1.6
--- mach-o-target.c	2 Jun 2009 14:26:14 -0000
***************
*** 1,5 ****
   /* Mach-O support for BFD.
!    Copyright 1999, 2000, 2001, 2002, 2007
      Free Software Foundation, Inc.

      This file is part of BFD, the Binary File Descriptor library.
--- 1,5 ----
   /* Mach-O support for BFD.
!    Copyright 1999, 2000, 2001, 2002, 2007, 2009
      Free Software Foundation, Inc.

      This file is part of BFD, the Binary File Descriptor library.
***************
*** 19,24 ****
--- 19,76 ----
      Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
      MA 02110-1301, USA.  */

+ /* Define generic entry points here so that we don't need to  
duplicate the
+    defines in every target.  But define once as this file may be  
included
+    several times.  */
+ #ifndef MACH_O_TARGET_COMMON_DEFINED
+ #define MACH_O_TARGET_COMMON_DEFINED
+
+ #define bfd_mach_o_mkarchive                           
_bfd_noarchive_mkarchive
+ #define bfd_mach_o_read_ar_hdr                         
_bfd_noarchive_read_ar_hdr
+ #define bfd_mach_o_slurp_armap                         
_bfd_noarchive_slurp_armap
+ #define bfd_mach_o_slurp_extended_name_table           
_bfd_noarchive_slurp_extended_name_table
+ #define bfd_mach_o_construct_extended_name_table       
_bfd_noarchive_construct_extended_name_table
+ #define bfd_mach_o_truncate_arname                     
_bfd_noarchive_truncate_arname
+ #define bfd_mach_o_write_armap                         
_bfd_noarchive_write_armap
+ #define bfd_mach_o_get_elt_at_index                    
_bfd_noarchive_get_elt_at_index
+ #define bfd_mach_o_generic_stat_arch_elt               
_bfd_noarchive_generic_stat_arch_elt
+ #define bfd_mach_o_update_armap_timestamp              
_bfd_noarchive_update_armap_timestamp
+ #define bfd_mach_o_close_and_cleanup                   
_bfd_generic_close_and_cleanup
+ #define bfd_mach_o_bfd_free_cached_info                
_bfd_generic_bfd_free_cached_info
+ #define bfd_mach_o_new_section_hook                    
_bfd_generic_new_section_hook
+ #define bfd_mach_o_get_section_contents_in_window      
_bfd_generic_get_section_contents_in_window
+ #define bfd_mach_o_bfd_is_local_label_name             
_bfd_nosymbols_bfd_is_local_label_name
+ #define bfd_mach_o_bfd_is_target_special_symbol       ((bfd_boolean  
(*) (bfd *, asymbol *)) bfd_false)
+ #define bfd_mach_o_bfd_is_local_label_name             
_bfd_nosymbols_bfd_is_local_label_name
+ #define bfd_mach_o_get_lineno                          
_bfd_nosymbols_get_lineno
+ #define bfd_mach_o_find_nearest_line                   
_bfd_nosymbols_find_nearest_line
+ #define bfd_mach_o_find_inliner_info                   
_bfd_nosymbols_find_inliner_info
+ #define bfd_mach_o_bfd_make_debug_symbol               
_bfd_nosymbols_bfd_make_debug_symbol
+ #define bfd_mach_o_read_minisymbols                    
_bfd_generic_read_minisymbols
+ #define bfd_mach_o_minisymbol_to_symbol                
_bfd_generic_minisymbol_to_symbol
+ #define bfd_mach_o_bfd_get_relocated_section_contents  
bfd_generic_get_relocated_section_contents
+ #define bfd_mach_o_bfd_relax_section                   
bfd_generic_relax_section
+ #define bfd_mach_o_bfd_link_hash_table_create          
_bfd_generic_link_hash_table_create
+ #define bfd_mach_o_bfd_link_hash_table_free            
_bfd_generic_link_hash_table_free
+ #define bfd_mach_o_bfd_link_add_symbols                
_bfd_generic_link_add_symbols
+ #define bfd_mach_o_bfd_link_just_syms                  
_bfd_generic_link_just_syms
+ #define bfd_mach_o_bfd_final_link                      
_bfd_generic_final_link
+ #define bfd_mach_o_bfd_link_split_section              
_bfd_generic_link_split_section
+ #define bfd_mach_o_set_arch_mach                       
bfd_default_set_arch_mach
+ #define bfd_mach_o_bfd_merge_private_bfd_data          
_bfd_generic_bfd_merge_private_bfd_data
+ #define bfd_mach_o_bfd_set_private_flags               
_bfd_generic_bfd_set_private_flags
+ #define bfd_mach_o_get_section_contents                
_bfd_generic_get_section_contents
+ #define bfd_mach_o_bfd_gc_sections                     
bfd_generic_gc_sections
+ #define bfd_mach_o_bfd_merge_sections                  
bfd_generic_merge_sections
+ #define bfd_mach_o_bfd_is_group_section                
bfd_generic_is_group_section
+ #define bfd_mach_o_bfd_discard_group                   
bfd_generic_discard_group
+ #define bfd_mach_o_section_already_linked              
_bfd_generic_section_already_linked
+ #define bfd_mach_o_bfd_define_common_symbol            
bfd_generic_define_common_symbol
+ #define bfd_mach_o_bfd_copy_private_header_data        
_bfd_generic_bfd_copy_private_header_data
+ #define bfd_mach_o_core_file_matches_executable_p      
generic_core_file_matches_executable_p
+
+ #endif /* MACH_O_TARGET_COMMON_DEFINED */
+
   #ifndef TARGET_NAME
   #error TARGET_NAME must be defined
   #endif /* TARGET_NAME */
Index: mach-o.c
===================================================================
RCS file: /cvs/src/src/bfd/mach-o.c,v
retrieving revision 1.33
diff -c -p -r1.33 mach-o.c
*** mach-o.c	16 Apr 2009 23:06:58 -0000	1.33
--- mach-o.c	2 Jun 2009 14:26:15 -0000
***************
*** 1,5 ****
   /* Mach-O support for BFD.
!    Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,  
2008
      Free Software Foundation, Inc.

      This file is part of BFD, the Binary File Descriptor library.
--- 1,5 ----
   /* Mach-O support for BFD.
!    Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,  
2008, 2009
      Free Software Foundation, Inc.

      This file is part of BFD, the Binary File Descriptor library.
***************
*** 27,80 ****
   #include "aout/stab_gnu.h"
   #include <ctype.h>

! #ifndef BFD_IO_FUNCS
! #define BFD_IO_FUNCS 0
! #endif
!
! #define bfd_mach_o_mkarchive                           
_bfd_noarchive_mkarchive
! #define bfd_mach_o_read_ar_hdr                         
_bfd_noarchive_read_ar_hdr
! #define bfd_mach_o_slurp_armap                         
_bfd_noarchive_slurp_armap
! #define bfd_mach_o_slurp_extended_name_table           
_bfd_noarchive_slurp_extended_name_table
! #define bfd_mach_o_construct_extended_name_table       
_bfd_noarchive_construct_extended_name_table
! #define bfd_mach_o_truncate_arname                     
_bfd_noarchive_truncate_arname
! #define bfd_mach_o_write_armap                         
_bfd_noarchive_write_armap
! #define bfd_mach_o_get_elt_at_index                    
_bfd_noarchive_get_elt_at_index
! #define bfd_mach_o_generic_stat_arch_elt               
_bfd_noarchive_generic_stat_arch_elt
! #define bfd_mach_o_update_armap_timestamp              
_bfd_noarchive_update_armap_timestamp
! #define	bfd_mach_o_close_and_cleanup                   
_bfd_generic_close_and_cleanup
! #define bfd_mach_o_bfd_free_cached_info                
_bfd_generic_bfd_free_cached_info
! #define bfd_mach_o_new_section_hook                    
_bfd_generic_new_section_hook
! #define bfd_mach_o_get_section_contents_in_window      
_bfd_generic_get_section_contents_in_window
! #define bfd_mach_o_bfd_is_local_label_name             
_bfd_nosymbols_bfd_is_local_label_name
! #define bfd_mach_o_bfd_is_target_special_symbol       ((bfd_boolean  
(*) (bfd *, asymbol *)) bfd_false)
! #define bfd_mach_o_bfd_is_local_label_name             
_bfd_nosymbols_bfd_is_local_label_name
! #define bfd_mach_o_get_lineno                          
_bfd_nosymbols_get_lineno
! #define bfd_mach_o_find_nearest_line                   
_bfd_nosymbols_find_nearest_line
! #define bfd_mach_o_find_inliner_info                   
_bfd_nosymbols_find_inliner_info
! #define bfd_mach_o_bfd_make_debug_symbol               
_bfd_nosymbols_bfd_make_debug_symbol
! #define bfd_mach_o_read_minisymbols                    
_bfd_generic_read_minisymbols
! #define bfd_mach_o_minisymbol_to_symbol                
_bfd_generic_minisymbol_to_symbol
! #define bfd_mach_o_bfd_get_relocated_section_contents  
bfd_generic_get_relocated_section_contents
! #define bfd_mach_o_bfd_relax_section                   
bfd_generic_relax_section
! #define bfd_mach_o_bfd_link_hash_table_create          
_bfd_generic_link_hash_table_create
! #define bfd_mach_o_bfd_link_hash_table_free            
_bfd_generic_link_hash_table_free
! #define bfd_mach_o_bfd_link_add_symbols                
_bfd_generic_link_add_symbols
! #define bfd_mach_o_bfd_link_just_syms                  
_bfd_generic_link_just_syms
! #define bfd_mach_o_bfd_final_link                      
_bfd_generic_final_link
! #define bfd_mach_o_bfd_link_split_section              
_bfd_generic_link_split_section
! #define bfd_mach_o_set_arch_mach                       
bfd_default_set_arch_mach
! #define bfd_mach_o_bfd_merge_private_bfd_data          
_bfd_generic_bfd_merge_private_bfd_data
! #define bfd_mach_o_bfd_set_private_flags               
_bfd_generic_bfd_set_private_flags
! #define bfd_mach_o_get_section_contents                
_bfd_generic_get_section_contents
! #define bfd_mach_o_set_section_contents                
_bfd_generic_set_section_contents
! #define bfd_mach_o_bfd_gc_sections                     
bfd_generic_gc_sections
! #define bfd_mach_o_bfd_merge_sections                  
bfd_generic_merge_sections
! #define bfd_mach_o_bfd_is_group_section                
bfd_generic_is_group_section
! #define bfd_mach_o_bfd_discard_group                   
bfd_generic_discard_group
! #define bfd_mach_o_section_already_linked              
_bfd_generic_section_already_linked
! #define bfd_mach_o_bfd_define_common_symbol            
bfd_generic_define_common_symbol
! #define bfd_mach_o_bfd_copy_private_header_data        
_bfd_generic_bfd_copy_private_header_data
! #define bfd_mach_o_core_file_matches_executable_p      
generic_core_file_matches_executable_p

   static unsigned int
   bfd_mach_o_version (bfd *abfd)
--- 27,35 ----
   #include "aout/stab_gnu.h"
   #include <ctype.h>

! #define bfd_mach_o_object_p bfd_mach_o_gen_object_p
! #define bfd_mach_o_core_p bfd_mach_o_gen_core_p
! #define bfd_mach_o_mkobject bfd_false

   static unsigned int
   bfd_mach_o_version (bfd *abfd)
*************** bfd_boolean
*** 91,112 ****
   bfd_mach_o_valid (bfd *abfd)
   {
     if (abfd == NULL || abfd->xvec == NULL)
!     return 0;

!   if (! ((abfd->xvec == &mach_o_be_vec)
! 	 || (abfd->xvec == &mach_o_le_vec)
! 	 || (abfd->xvec == &mach_o_fat_vec)))
!     return 0;

     if (abfd->tdata.mach_o_data == NULL)
!     return 0;
!   return 1;
   }

   /* Copy any private info we understand from the input symbol
      to the output symbol.  */

! static bfd_boolean
   bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
   					 asymbol *isymbol ATTRIBUTE_UNUSED,
   					 bfd *obfd ATTRIBUTE_UNUSED,
--- 46,225 ----
   bfd_mach_o_valid (bfd *abfd)
   {
     if (abfd == NULL || abfd->xvec == NULL)
!     return FALSE;

!   if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
!     return FALSE;

     if (abfd->tdata.mach_o_data == NULL)
!     return FALSE;
!   return TRUE;
! }
!
! /* Tables to translate well known Mach-O segment/section names to bfd
!    names.  Use of canonical names (such as .text or .debug_frame) is  
required
!    by gdb.  */
!
! struct mach_o_section_name_xlat
! {
!   const char *bfd_name;
!   const char *mach_o_name;
! };
!
! static const struct mach_o_section_name_xlat  
dwarf_section_names_xlat[] =
!   {
!     { ".debug_frame", "__debug_frame" },
!     { ".debug_info", "__debug_info" },
!     { ".debug_abbrev", "__debug_abbrev" },
!     { ".debug_aranges", "__debug_aranges" },
!     { ".debug_macinfo", "__debug_macinfo" },
!     { ".debug_line", "__debug_line" },
!     { ".debug_loc", "__debug_loc" },
!     { ".debug_pubnames", "__debug_pubnames" },
!     { ".debug_pubtypes", "__debug_pubtypes" },
!     { ".debug_str", "__debug_str" },
!     { ".debug_ranges", "__debug_ranges" },
!     { NULL, NULL}
!   };
!
! static const struct mach_o_section_name_xlat  
text_section_names_xlat[] =
!   {
!     { ".text", "__text" },
!     { ".cstring", "__cstring" },
!     { ".eh_frame", "__eh_frame" },
!     { NULL, NULL}
!   };
!
! static const struct mach_o_section_name_xlat  
data_section_names_xlat[] =
!   {
!     { ".data", "__data" },
!     { ".bss", "__bss" },
!     { NULL, NULL}
!   };
!
! struct mach_o_segment_name_xlat
! {
!   const char *segname;
!   const struct mach_o_section_name_xlat *sections;
! };
!
! static const struct mach_o_segment_name_xlat segsec_names_xlat[] =
!   {
!     { "__DWARF", dwarf_section_names_xlat },
!     { "__TEXT", text_section_names_xlat },
!     { "__DATA", data_section_names_xlat },
!     { NULL, NULL }
!   };
!
!
! /* Mach-O to bfd names.  */
!
! static char *
! bfd_mach_o_convert_section_name_to_bfd (bfd *abfd,  
bfd_mach_o_section *section)
! {
!   const struct mach_o_segment_name_xlat *seg;
!   char *res;
!   unsigned int len;
!
!   for (seg = segsec_names_xlat; seg->segname; seg++)
!     {
!       if (strcmp (seg->segname, section->segname) == 0)
!         {
!           const struct mach_o_section_name_xlat *sec;
!
!           for (sec = seg->sections; sec->mach_o_name; sec++)
!             {
!               if (strcmp (sec->mach_o_name, section->sectname) == 0)
!                 {
!                   len = strlen (sec->bfd_name);
!                   res = bfd_alloc (abfd, len + 1);
!
!                   if (res == NULL)
!                     return NULL;
!                   strcpy (res, sec->bfd_name);
!                   return res;
!                 }
!             }
!         }
!     }
!
!   len = sizeof ("LC_SEGMENT") - 1 + 1
!     + strlen (section->segname) + 1
!     + strlen (section->sectname) + 1;
!
!   res = bfd_alloc (abfd, len);
!   if (res == NULL)
!     return NULL;
!   snprintf (res, len, "LC_SEGMENT.%s.%s", section->segname, section- 
 >sectname);
!   return res;
! }
!
! /* Convert a bfd sectio name to a Mach-O segment + section name.  */
!
! static void
! bfd_mach_o_convert_section_name_to_mach_o (bfd *abfd ATTRIBUTE_UNUSED,
!                                            asection *sect,
!                                            bfd_mach_o_section  
*section)
! {
!   const struct mach_o_segment_name_xlat *seg;
!   const char *name = bfd_get_section_name (abfd, sect);
!   const char *dot;
!   unsigned int len;
!   unsigned int seglen;
!   unsigned int seclen;
!
!   /* List of well known names.  */
!   for (seg = segsec_names_xlat; seg->segname; seg++)
!     {
!       const struct mach_o_section_name_xlat *sec;
!
!       for (sec = seg->sections; sec->mach_o_name; sec++)
!         {
!           if (strcmp (sec->bfd_name, name) == 0)
!             {
!               strcpy (section->segname, seg->segname);
!               strcpy (section->sectname, sec->mach_o_name);
!               return;
!             }
!         }
!     }
!
!   /* Strip LC_SEGMENT. prefix.  */
!   if (strncmp (name, "LC_SEGMENT.", 11) == 0)
!     name += 11;
!
!   /* Find a dot.  */
!   dot = strchr (name, '.');
!   len = strlen (name);
!
!   /* Try to split name into segment and section names.  */
!   if (dot && dot != name)
!     {
!       seglen = dot - name;
!       seclen = len - (dot + 1 - name);
!
!       if (seglen < 16 && seclen < 16)
!         {
!           memcpy (section->segname, name, seglen);
!           section->segname[seglen] = 0;
!           memcpy (section->sectname, dot + 1, seclen);
!           section->sectname[seclen] = 0;
!           return;
!         }
!     }
!
!   if (len > 16)
!     len = 16;
!   memcpy (section->segname, name, len);
!   section->segname[len] = 0;
!   memcpy (section->sectname, name, len);
!   section->sectname[len] = 0;
   }

   /* Copy any private info we understand from the input symbol
      to the output symbol.  */

! bfd_boolean
   bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
   					 asymbol *isymbol ATTRIBUTE_UNUSED,
   					 bfd *obfd ATTRIBUTE_UNUSED,
*************** bfd_mach_o_bfd_copy_private_symbol_data
*** 118,124 ****
   /* Copy any private info we understand from the input section
      to the output section.  */

! static bfd_boolean
   bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
   					  asection *isection ATTRIBUTE_UNUSED,
   					  bfd *obfd ATTRIBUTE_UNUSED,
--- 231,237 ----
   /* Copy any private info we understand from the input section
      to the output section.  */

! bfd_boolean
   bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
   					  asection *isection ATTRIBUTE_UNUSED,
   					  bfd *obfd ATTRIBUTE_UNUSED,
*************** bfd_mach_o_bfd_copy_private_section_data
*** 130,146 ****
   /* Copy any private info we understand from the input bfd
      to the output bfd.  */

! static bfd_boolean
   bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
   {
     BFD_ASSERT (bfd_mach_o_valid (ibfd));
     BFD_ASSERT (bfd_mach_o_valid (obfd));

!   obfd->tdata.mach_o_data = ibfd->tdata.mach_o_data;
!   obfd->tdata.mach_o_data->ibfd = ibfd;
     return TRUE;
   }

   static long
   bfd_mach_o_count_symbols (bfd *abfd)
   {
--- 243,265 ----
   /* Copy any private info we understand from the input bfd
      to the output bfd.  */

! bfd_boolean
   bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
   {
+   if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
+       || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
+     return TRUE;
+
     BFD_ASSERT (bfd_mach_o_valid (ibfd));
     BFD_ASSERT (bfd_mach_o_valid (obfd));

!   /* FIXME: copy commands.  */
!
     return TRUE;
   }

+ /* Count the total number of symbols.  Traverse all sections.  */
+
   static long
   bfd_mach_o_count_symbols (bfd *abfd)
   {
*************** bfd_mach_o_count_symbols (bfd *abfd)
*** 161,167 ****
     return nsyms;
   }

! static long
   bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
   {
     long nsyms = bfd_mach_o_count_symbols (abfd);
--- 280,286 ----
     return nsyms;
   }

! long
   bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
   {
     long nsyms = bfd_mach_o_count_symbols (abfd);
*************** bfd_mach_o_get_symtab_upper_bound (bfd *
*** 172,178 ****
     return ((nsyms + 1) * sizeof (asymbol *));
   }

! static long
   bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
   {
     bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
--- 291,297 ----
     return ((nsyms + 1) * sizeof (asymbol *));
   }

! long
   bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
   {
     bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
*************** bfd_mach_o_canonicalize_symtab (bfd *abf
*** 210,216 ****
     return nsyms;
   }

! static void
   bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
   			    asymbol *symbol,
   			    symbol_info *ret)
--- 329,335 ----
     return nsyms;
   }

! void
   bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
   			    asymbol *symbol,
   			    symbol_info *ret)
*************** bfd_mach_o_get_symbol_info (bfd *abfd AT
*** 218,224 ****
     bfd_symbol_info (symbol, ret);
   }

! static void
   bfd_mach_o_print_symbol (bfd *abfd,
   			 PTR afile,
   			 asymbol *symbol,
--- 337,343 ----
     bfd_symbol_info (symbol, ret);
   }

! void
   bfd_mach_o_print_symbol (bfd *abfd,
   			 PTR afile,
   			 asymbol *symbol,
*************** bfd_mach_o_convert_architecture (bfd_mac
*** 319,331 ****
       }
   }

! static int
   bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
   {
     unsigned char buf[32];
     unsigned int size;

!   size = (header->version == 2) ? 32 : 28;

     bfd_h_put_32 (abfd, header->magic, buf + 0);
     bfd_h_put_32 (abfd, header->cputype, buf + 4);
--- 438,451 ----
       }
   }

! static bfd_boolean
   bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
   {
     unsigned char buf[32];
     unsigned int size;

!   size = (header->version == 2) ?
!     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;

     bfd_h_put_32 (abfd, header->magic, buf + 0);
     bfd_h_put_32 (abfd, header->cputype, buf + 4);
*************** bfd_mach_o_write_header (bfd *abfd, bfd_
*** 340,348 ****

     bfd_seek (abfd, 0, SEEK_SET);
     if (bfd_bwrite ((PTR) buf, size, abfd) != size)
!     return -1;

!   return 0;
   }

   static int
--- 460,468 ----

     bfd_seek (abfd, 0, SEEK_SET);
     if (bfd_bwrite ((PTR) buf, size, abfd) != size)
!     return FALSE;

!   return TRUE;
   }

   static int
*************** bfd_mach_o_scan_write_section_32 (bfd *a
*** 382,388 ****
   				  bfd_mach_o_section *section,
   				  bfd_vma offset)
   {
!   unsigned char buf[68];

     memcpy (buf, section->sectname, 16);
     memcpy (buf + 16, section->segname, 16);
--- 502,508 ----
   				  bfd_mach_o_section *section,
   				  bfd_vma offset)
   {
!   unsigned char buf[BFD_MACH_O_SECTION_SIZE];

     memcpy (buf, section->sectname, 16);
     memcpy (buf + 16, section->segname, 16);
*************** bfd_mach_o_scan_write_section_32 (bfd *a
*** 397,403 ****
     bfd_h_put_32 (abfd, section->reserved2, buf + 64);

     bfd_seek (abfd, offset, SEEK_SET);
!   if (bfd_bwrite ((PTR) buf, 68, abfd) != 68)
       return -1;

     return 0;
--- 517,524 ----
     bfd_h_put_32 (abfd, section->reserved2, buf + 64);

     bfd_seek (abfd, offset, SEEK_SET);
!   if (bfd_bwrite ((PTR) buf, BFD_MACH_O_SECTION_SIZE, abfd)
!       != BFD_MACH_O_SECTION_SIZE)
       return -1;

     return 0;
*************** bfd_mach_o_scan_write_section_64 (bfd *a
*** 408,414 ****
   				  bfd_mach_o_section *section,
   				  bfd_vma offset)
   {
!   unsigned char buf[80];

     memcpy (buf, section->sectname, 16);
     memcpy (buf + 16, section->segname, 16);
--- 529,535 ----
   				  bfd_mach_o_section *section,
   				  bfd_vma offset)
   {
!   unsigned char buf[BFD_MACH_O_SECTION_64_SIZE];

     memcpy (buf, section->sectname, 16);
     memcpy (buf + 16, section->segname, 16);
*************** bfd_mach_o_scan_write_section_64 (bfd *a
*** 424,430 ****
     bfd_h_put_32 (abfd, section->reserved3, buf + 76);

     bfd_seek (abfd, offset, SEEK_SET);
!   if (bfd_bwrite ((PTR) buf, 80, abfd) != 80)
       return -1;

     return 0;
--- 545,552 ----
     bfd_h_put_32 (abfd, section->reserved3, buf + 76);

     bfd_seek (abfd, offset, SEEK_SET);
!   if (bfd_bwrite ((PTR) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
!       != BFD_MACH_O_SECTION_64_SIZE)
       return -1;

     return 0;
*************** bfd_mach_o_scan_write_segment (bfd *abfd
*** 490,527 ****
   	return -1;
       }

-   {
-     char buf[1024];
-     bfd_vma nbytes = seg->filesize;
-     bfd_vma curoff = seg->fileoff;
-
-     while (nbytes > 0)
-       {
- 	bfd_vma thiswrite = nbytes;
-
- 	if (thiswrite > 1024)
- 	  thiswrite = 1024;
-
- 	bfd_seek (abfd, curoff, SEEK_SET);
- 	if (bfd_bread ((PTR) buf, thiswrite, abfd) != thiswrite)
- 	  return -1;
-
- 	bfd_seek (abfd, curoff, SEEK_SET);
- 	if (bfd_bwrite ((PTR) buf, thiswrite, abfd) != thiswrite)
- 	  return -1;
-
- 	nbytes -= thiswrite;
- 	curoff += thiswrite;
-       }
-   }
-
     for (i = 0; i < seg->nsects; i++)
       {
         bfd_vma segoff;
         if (wide)
! 	segoff = command->offset + 64 + 8 + (i * 80);
         else
! 	segoff = command->offset + 48 + 8 + (i * 68);

         if (bfd_mach_o_scan_write_section
   	  (abfd, &seg->sections[i], segoff, wide) != 0)
--- 612,626 ----
   	return -1;
       }

     for (i = 0; i < seg->nsects; i++)
       {
         bfd_vma segoff;
         if (wide)
! 	segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
!           + (i * BFD_MACH_O_SECTION_64_SIZE);
         else
! 	segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
!           + (i * BFD_MACH_O_SECTION_SIZE);

         if (bfd_mach_o_scan_write_section
   	  (abfd, &seg->sections[i], segoff, wide) != 0)
*************** bfd_mach_o_scan_write_symtab (bfd *abfd,
*** 606,627 ****
     return 0;
   }

! static bfd_boolean
   bfd_mach_o_write_contents (bfd *abfd)
   {
     unsigned int i;
-   asection *s;
-
     bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;

-   /* Write data sections first in case they overlap header data to be
-      written later.  */
-
-   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
-     ;
-
     /* Now write header information.  */
!   if (bfd_mach_o_write_header (abfd, &mdata->header) != 0)
       return FALSE;

     for (i = 0; i < mdata->header.ncmds; i++)
--- 705,718 ----
     return 0;
   }

! bfd_boolean
   bfd_mach_o_write_contents (bfd *abfd)
   {
     unsigned int i;
     bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;

     /* Now write header information.  */
!   if (!bfd_mach_o_write_header (abfd, &mdata->header))
       return FALSE;

     for (i = 0; i < mdata->header.ncmds; i++)
*************** bfd_mach_o_write_contents (bfd *abfd)
*** 630,636 ****
         bfd_mach_o_load_command *cur = &mdata->commands[i];
         unsigned long typeflag;

!       typeflag = cur->type_required ? cur->type &  
BFD_MACH_O_LC_REQ_DYLD : cur->type;

         bfd_h_put_32 (abfd, typeflag, buf);
         bfd_h_put_32 (abfd, cur->len, buf + 4);
--- 721,727 ----
         bfd_mach_o_load_command *cur = &mdata->commands[i];
         unsigned long typeflag;

!       typeflag = cur->type | (cur->type_required ?  
BFD_MACH_O_LC_REQ_DYLD : 0);

         bfd_h_put_32 (abfd, typeflag, buf);
         bfd_h_put_32 (abfd, cur->len, buf + 4);
*************** bfd_mach_o_write_contents (bfd *abfd)
*** 686,692 ****
     return TRUE;
   }

! static int
   bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
   			   struct bfd_link_info *info ATTRIBUTE_UNUSED)
   {
--- 777,897 ----
     return TRUE;
   }

! /* Build Mach-O load commands from the sections.  */
!
! bfd_boolean
! bfd_mach_o_build_commands (bfd *abfd)
! {
!   bfd_mach_o_data_struct *mdata = bfd_get_mach_o_data (abfd);
!   unsigned int wide = (mdata->header.version == 2);
!   bfd_mach_o_segment_command *seg;
!   bfd_mach_o_section *sections;
!   asection *sec;
!   file_ptr filepos;
!
!   /* Return now if commands are already built.  */
!   if (mdata->header.ncmds)
!     return FALSE;
!
!   /* Very simple version: 1 command (segment) containing all  
sections.  */
!   mdata->header.ncmds = 1;
!   mdata->commands = bfd_alloc (abfd, mdata->header.ncmds
!                                * sizeof (bfd_mach_o_load_command));
!   if (mdata->commands == NULL)
!     return FALSE;
!   seg = &mdata->commands[0].command.segment;
!   seg->nsects = bfd_count_sections (abfd);
!   sections = bfd_alloc (abfd, seg->nsects * sizeof  
(bfd_mach_o_section));
!   if (sections == NULL)
!     return FALSE;
!   seg->sections = sections;
!
!   /* Set segment command.  */
!   if (wide)
!     {
!       mdata->commands[0].type = BFD_MACH_O_LC_SEGMENT_64;
!       mdata->commands[0].offset = BFD_MACH_O_HEADER_64_SIZE;
!       mdata->commands[0].len = BFD_MACH_O_LC_SEGMENT_64_SIZE
!         + BFD_MACH_O_SECTION_64_SIZE * seg->nsects;
!     }
!   else
!     {
!       mdata->commands[0].type = BFD_MACH_O_LC_SEGMENT;
!       mdata->commands[0].offset = BFD_MACH_O_HEADER_SIZE;
!       mdata->commands[0].len = BFD_MACH_O_LC_SEGMENT_SIZE
!         + BFD_MACH_O_SECTION_SIZE * seg->nsects;
!     }
!   mdata->commands[0].type_required = FALSE;
!   mdata->header.sizeofcmds = mdata->commands[0].len;
!
!   filepos = mdata->commands[0].offset + mdata->commands[0].len;
!
!   memset (seg->segname, 0, sizeof (seg->segname));
!   seg->vmaddr = 0;
!   seg->fileoff = filepos;
!   seg->filesize = 0;
!   seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
!     | BFD_MACH_O_PROT_EXECUTE;
!   seg->initprot = seg->maxprot;
!   seg->flags = 0;
!
!   /* Create Mach-O sections.  */
!   for (sec = abfd->sections; sec; sec = sec->next)
!     {
!       sections->bfdsection = sec;
!       bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, sections);
!       sections->addr = bfd_get_section_vma (abfd, sec);
!       sections->size = bfd_get_section_size (sec);
!       sections->align = bfd_get_section_alignment (abfd, sec);
!
!       filepos = (filepos + ((file_ptr) 1 << sections->align) - 1)
!         & ((file_ptr) -1 << sections->align);
!       sections->offset = filepos;
!       sections->reloff = 0;
!       sections->nreloc = 0;
!       sections->reserved1 = 0;
!       sections->reserved2 = 0;
!       sections->reserved3 = 0;
!
!       sec->filepos = filepos;
!
!       filepos += sections->size;
!       sections++;
!     }
!   seg->filesize = filepos - seg->fileoff;
!   seg->vmsize = seg->filesize;
!
!   return TRUE;
! }
!
! /* Set the contents of a section.  */
!
! bfd_boolean
! bfd_mach_o_set_section_contents (bfd *abfd,
! 				 asection *section,
! 				 const void * location,
! 				 file_ptr offset,
! 				 bfd_size_type count)
! {
!   file_ptr pos;
!
!   /* This must be done first, because bfd_set_section_contents is
!      going to set output_has_begun to TRUE.  */
!   if (! abfd->output_has_begun && ! bfd_mach_o_build_commands (abfd))
!     return FALSE;
!
!   if (count == 0)
!     return TRUE;
!
!   pos = section->filepos + offset;
!   if (bfd_seek (abfd, pos, SEEK_SET) != 0
!       || bfd_bwrite (location, count, abfd) != count)
!     return FALSE;
!
!   return TRUE;
! }
!
! int
   bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
   			   struct bfd_link_info *info ATTRIBUTE_UNUSED)
   {
*************** bfd_mach_o_sizeof_headers (bfd *a ATTRIB
*** 696,702 ****
   /* Make an empty symbol.  This is required only because
      bfd_make_section_anyway wants to create a symbol for the  
section.  */

! static asymbol *
   bfd_mach_o_make_empty_symbol (bfd *abfd)
   {
     asymbol *new;
--- 901,907 ----
   /* Make an empty symbol.  This is required only because
      bfd_make_section_anyway wants to create a symbol for the  
section.  */

! asymbol *
   bfd_mach_o_make_empty_symbol (bfd *abfd)
   {
     asymbol *new;
*************** bfd_mach_o_make_empty_symbol (bfd *abfd)
*** 708,766 ****
     return new;
   }

! static int
   bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
   {
     unsigned char buf[32];
     unsigned int size;
     bfd_vma (*get32) (const void *) = NULL;

-   bfd_seek (abfd, 0, SEEK_SET);
-
     /* Just read the magic number.  */
     if (bfd_bread ((PTR) buf, 4, abfd) != 4)
!     return -1;

!   if (bfd_getb32 (buf) == 0xfeedface)
       {
         header->byteorder = BFD_ENDIAN_BIG;
!       header->magic = 0xfeedface;
         header->version = 1;
         get32 = bfd_getb32;
       }
!   else if (bfd_getl32 (buf) == 0xfeedface)
       {
         header->byteorder = BFD_ENDIAN_LITTLE;
!       header->magic = 0xfeedface;
         header->version = 1;
         get32 = bfd_getl32;
       }
!   else if (bfd_getb32 (buf) == 0xfeedfacf)
       {
         header->byteorder = BFD_ENDIAN_BIG;
!       header->magic = 0xfeedfacf;
         header->version = 2;
         get32 = bfd_getb32;
       }
!   else if (bfd_getl32 (buf) == 0xfeedfacf)
       {
         header->byteorder = BFD_ENDIAN_LITTLE;
!       header->magic = 0xfeedfacf;
         header->version = 2;
         get32 = bfd_getl32;
       }
     else
       {
         header->byteorder = BFD_ENDIAN_UNKNOWN;
!       return -1;
       }

     /* Once the size of the header is known, read the full header.  */
!   size = (header->version == 2) ? 32 : 28;

     bfd_seek (abfd, 0, SEEK_SET);
     if (bfd_bread ((PTR) buf, size, abfd) != size)
!     return -1;

     header->cputype = (*get32) (buf + 4);
     header->cpusubtype = (*get32) (buf + 8);
--- 913,971 ----
     return new;
   }

! static bfd_boolean
   bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
   {
     unsigned char buf[32];
     unsigned int size;
     bfd_vma (*get32) (const void *) = NULL;

     /* Just read the magic number.  */
+   bfd_seek (abfd, 0, SEEK_SET);
     if (bfd_bread ((PTR) buf, 4, abfd) != 4)
!     return FALSE;

!   if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC)
       {
         header->byteorder = BFD_ENDIAN_BIG;
!       header->magic = BFD_MACH_O_MH_MAGIC;
         header->version = 1;
         get32 = bfd_getb32;
       }
!   else if (bfd_getl32 (buf) == BFD_MACH_O_MH_MAGIC)
       {
         header->byteorder = BFD_ENDIAN_LITTLE;
!       header->magic = BFD_MACH_O_MH_MAGIC;
         header->version = 1;
         get32 = bfd_getl32;
       }
!   else if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC_64)
       {
         header->byteorder = BFD_ENDIAN_BIG;
!       header->magic = BFD_MACH_O_MH_MAGIC_64;
         header->version = 2;
         get32 = bfd_getb32;
       }
!   else if (bfd_getl32 (buf) == BFD_MACH_O_MH_MAGIC_64)
       {
         header->byteorder = BFD_ENDIAN_LITTLE;
!       header->magic = BFD_MACH_O_MH_MAGIC_64;
         header->version = 2;
         get32 = bfd_getl32;
       }
     else
       {
         header->byteorder = BFD_ENDIAN_UNKNOWN;
!       return FALSE;
       }

     /* Once the size of the header is known, read the full header.  */
!   size = (header->version == 2) ?
!     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;

     bfd_seek (abfd, 0, SEEK_SET);
     if (bfd_bread ((PTR) buf, size, abfd) != size)
!     return FALSE;

     header->cputype = (*get32) (buf + 4);
     header->cpusubtype = (*get32) (buf + 8);
*************** bfd_mach_o_read_header (bfd *abfd, bfd_m
*** 772,778 ****
     if (header->version == 2)
       header->reserved = (*get32) (buf + 28);

!   return 0;
   }

   static asection *
--- 977,983 ----
     if (header->version == 2)
       header->reserved = (*get32) (buf + 28);

!   return TRUE;
   }

   static asection *
*************** bfd_mach_o_make_bfd_section (bfd *abfd,
*** 781,821 ****
   {
     asection *bfdsec;
     char *sname;
-   const char *prefix = "LC_SEGMENT";
-   unsigned int snamelen;
     flagword flags;

!   snamelen = strlen (prefix) + 1
!     + strlen (section->segname) + 1
!     + strlen (section->sectname) + 1;
!
!   sname = bfd_alloc (abfd, snamelen);
     if (sname == NULL)
       return NULL;

-   /* Use canonical dwarf section names for dwarf sections.  */
-   if (strcmp (section->segname, "__DWARF") == 0
-       && strncmp (section->sectname, "__", 2) == 0)
-     sprintf (sname, ".%s", section->sectname + 2);
-   else if (strcmp (section->segname, "__TEXT") == 0)
-     {
-       if (strcmp (section->sectname, "__eh_frame") == 0)
- 	strcpy (sname, ".eh_frame");
-       else if (section->sectname[0])
- 	sprintf (sname, "%s.%s", section->segname, section->sectname);
-       else
- 	strcpy (sname, section->segname);
-     }
-   else if (strcmp (section->segname, "__DATA") == 0)
-     {
-       if (section->sectname[0])
- 	sprintf (sname, "%s.%s", section->segname, section->sectname);
-       else
- 	strcpy (sname, section->segname);
-     }
-   else
-     sprintf (sname, "%s.%s.%s", prefix, section->segname, section- 
 >sectname);
-
     if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
       flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
     else
--- 986,997 ----
   {
     asection *bfdsec;
     char *sname;
     flagword flags;

!   sname = bfd_mach_o_convert_section_name_to_bfd (abfd, section);
     if (sname == NULL)
       return NULL;

     if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
       flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
     else
*************** bfd_mach_o_scan_read_section_32 (bfd *ab
*** 853,862 ****
   				 bfd_vma offset,
   				 unsigned long prot)
   {
!   unsigned char buf[68];

     bfd_seek (abfd, offset, SEEK_SET);
!   if (bfd_bread ((PTR) buf, 68, abfd) != 68)
       return -1;

     memcpy (section->sectname, buf, 16);
--- 1029,1039 ----
   				 bfd_vma offset,
   				 unsigned long prot)
   {
!   unsigned char buf[BFD_MACH_O_SECTION_SIZE];

     bfd_seek (abfd, offset, SEEK_SET);
!   if (bfd_bread ((PTR) buf, BFD_MACH_O_SECTION_SIZE, abfd)
!       != BFD_MACH_O_SECTION_SIZE)
       return -1;

     memcpy (section->sectname, buf, 16);
*************** bfd_mach_o_scan_read_section_64 (bfd *ab
*** 887,896 ****
   				 bfd_vma offset,
   				 unsigned long prot)
   {
!   unsigned char buf[80];

     bfd_seek (abfd, offset, SEEK_SET);
!   if (bfd_bread ((PTR) buf, 80, abfd) != 80)
       return -1;

     memcpy (section->sectname, buf, 16);
--- 1064,1074 ----
   				 bfd_vma offset,
   				 unsigned long prot)
   {
!   unsigned char buf[BFD_MACH_O_SECTION_64_SIZE];

     bfd_seek (abfd, offset, SEEK_SET);
!   if (bfd_bread ((PTR) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
!       != BFD_MACH_O_SECTION_64_SIZE)
       return -1;

     memcpy (section->sectname, buf, 16);
*************** bfd_mach_o_scan_read_segment (bfd *abfd,
*** 1551,1560 ****
     unsigned char buf[64];
     bfd_mach_o_segment_command *seg = &command->command.segment;
     unsigned long i;
-   asection *bfdsec;
-   char *sname;
-   const char *prefix = "LC_SEGMENT";
-   unsigned int snamelen;

     if (wide)
       {
--- 1729,1734 ----
*************** bfd_mach_o_scan_read_segment (bfd *abfd,
*** 1597,1641 ****
         seg->flags = bfd_h_get_32 (abfd, buf + 44);
       }

-   snamelen = strlen (prefix) + 1 + strlen (seg->segname) + 1;
-   sname = bfd_alloc (abfd, snamelen);
-   if (sname == NULL)
-     return -1;
-   if (strcmp (seg->segname, "__TEXT") == 0
-       || strcmp (seg->segname, "__DATA") == 0
-       || strcmp (seg->segname, "__IMPORT") == 0
-       || strcmp (seg->segname, "__LINKEDIT") == 0)
-     strcpy (sname, seg->segname);
-   else
-     sprintf (sname, "%s.%s", prefix, seg->segname);
-
-   bfdsec = bfd_make_section_anyway (abfd, sname);
-   if (bfdsec == NULL)
-     return -1;
-
-   bfdsec->vma = seg->vmaddr;
-   bfdsec->lma = seg->vmaddr;
-   bfdsec->size = seg->filesize;
-   bfdsec->filepos = seg->fileoff;
-   bfdsec->alignment_power = 0x0;
-   bfdsec->flags = SEC_HAS_CONTENTS;
-   bfdsec->segment_mark = 1;
-
-   seg->segment = bfdsec;
-
     if (seg->nsects != 0)
       {
!       seg->sections = bfd_alloc (abfd, seg->nsects * sizeof  
(bfd_mach_o_section));
         if (seg->sections == NULL)
   	return -1;

         for (i = 0; i < seg->nsects; i++)
   	{
   	  bfd_vma segoff;
! 	  if (wide)
! 	    segoff = command->offset + 64 + 8 + (i * 80);
! 	  else
! 	    segoff = command->offset + 48 + 8 + (i * 68);

   	  if (bfd_mach_o_scan_read_section
   	      (abfd, &seg->sections[i], segoff, seg->initprot, wide) != 0)
--- 1771,1792 ----
         seg->flags = bfd_h_get_32 (abfd, buf + 44);
       }

     if (seg->nsects != 0)
       {
!       seg->sections = bfd_alloc (abfd, seg->nsects
!                                  * sizeof (bfd_mach_o_section));
         if (seg->sections == NULL)
   	return -1;

         for (i = 0; i < seg->nsects; i++)
   	{
   	  bfd_vma segoff;
!           if (wide)
!             segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
!               + (i * BFD_MACH_O_SECTION_64_SIZE);
!           else
!             segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
!               + (i * BFD_MACH_O_SECTION_SIZE);

   	  if (bfd_mach_o_scan_read_section
   	      (abfd, &seg->sections[i], segoff, seg->initprot, wide) != 0)
*************** bfd_mach_o_scan_read_command (bfd *abfd,
*** 1667,1675 ****
     if (bfd_bread ((PTR) buf, 8, abfd) != 8)
       return -1;

!   command->type = (bfd_h_get_32 (abfd, buf) &  
~BFD_MACH_O_LC_REQ_DYLD);
     command->type_required = (bfd_h_get_32 (abfd, buf) &  
BFD_MACH_O_LC_REQ_DYLD
! 			    ? 1 : 0);
     command->len = bfd_h_get_32 (abfd, buf + 4);

     switch (command->type)
--- 1818,1826 ----
     if (bfd_bread ((PTR) buf, 8, abfd) != 8)
       return -1;

!   command->type = bfd_h_get_32 (abfd, buf) & ~BFD_MACH_O_LC_REQ_DYLD;
     command->type_required = (bfd_h_get_32 (abfd, buf) &  
BFD_MACH_O_LC_REQ_DYLD
! 			    ? TRUE : FALSE);
     command->len = bfd_h_get_32 (abfd, buf + 4);

     switch (command->type)
*************** bfd_mach_o_scan (bfd *abfd,
*** 1876,1887 ****
     unsigned long cpusubtype;
     unsigned int hdrsize;

!   hdrsize = (header->version == 2) ? 32 : 28;

     mdata->header = *header;
     mdata->symbols = NULL;

!   abfd->flags = abfd->flags & (BFD_IN_MEMORY | BFD_IO_FUNCS);
     switch (header->filetype)
       {
       case BFD_MACH_O_MH_OBJECT:
--- 2027,2039 ----
     unsigned long cpusubtype;
     unsigned int hdrsize;

!   hdrsize = (header->version == 2) ?
!     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;

     mdata->header = *header;
     mdata->symbols = NULL;

!   abfd->flags = abfd->flags & BFD_IN_MEMORY;
     switch (header->filetype)
       {
       case BFD_MACH_O_MH_OBJECT:
*************** bfd_mach_o_scan (bfd *abfd,
*** 1940,1946 ****
   }

   bfd_boolean
! bfd_mach_o_mkobject (bfd *abfd)
   {
     bfd_mach_o_data_struct *mdata = NULL;

--- 2092,2098 ----
   }

   bfd_boolean
! bfd_mach_o_mkobject_init (bfd *abfd)
   {
     bfd_mach_o_data_struct *mdata = NULL;

*************** bfd_mach_o_mkobject (bfd *abfd)
*** 1968,1980 ****
   }

   const bfd_target *
! bfd_mach_o_object_p (bfd *abfd)
   {
     struct bfd_preserve preserve;
     bfd_mach_o_header header;

     preserve.marker = NULL;
!   if (bfd_mach_o_read_header (abfd, &header) != 0)
       goto wrong;

     if (! (header.byteorder == BFD_ENDIAN_BIG
--- 2120,2134 ----
   }

   const bfd_target *
! bfd_mach_o_header_p (bfd *abfd,
!                      bfd_mach_o_filetype filetype,
!                      bfd_mach_o_cpu_type cputype)
   {
     struct bfd_preserve preserve;
     bfd_mach_o_header header;

     preserve.marker = NULL;
!   if (!bfd_mach_o_read_header (abfd, &header))
       goto wrong;

     if (! (header.byteorder == BFD_ENDIAN_BIG
*************** bfd_mach_o_object_p (bfd *abfd)
*** 1993,1998 ****
--- 2147,2188 ----
   	     && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
       goto wrong;

+   /* Check cputype and filetype.
+      In case of wildcard, do not accept magics that are handled by  
existing
+      targets.  */
+   if (cputype)
+     {
+       if (header.cputype != cputype)
+         goto wrong;
+     }
+   else
+     {
+       switch (header.cputype)
+         {
+         case BFD_MACH_O_CPU_TYPE_I386:
+           /* Handled by mach-o-i386 */
+           goto wrong;
+         default:
+           break;
+         }
+     }
+   if (filetype)
+     {
+       if (header.filetype != filetype)
+         goto wrong;
+     }
+   else
+     {
+       switch (header.filetype)
+         {
+         case BFD_MACH_O_MH_CORE:
+           /* Handled by core_p */
+           goto wrong;
+         default:
+           break;
+         }
+     }
+
     preserve.marker = bfd_zalloc (abfd, sizeof  
(bfd_mach_o_data_struct));
     if (preserve.marker == NULL
         || !bfd_preserve_save (abfd, &preserve))
*************** bfd_mach_o_object_p (bfd *abfd)
*** 2014,2067 ****
     return NULL;
   }

! const bfd_target *
! bfd_mach_o_core_p (bfd *abfd)
   {
!   struct bfd_preserve preserve;
!   bfd_mach_o_header header;
!
!   preserve.marker = NULL;
!   if (bfd_mach_o_read_header (abfd, &header) != 0)
!     goto wrong;
!
!   if (! (header.byteorder == BFD_ENDIAN_BIG
! 	 || header.byteorder == BFD_ENDIAN_LITTLE))
!     {
!       fprintf (stderr, "unknown header byte-order value 0x%lx\n",
! 	       (unsigned long) header.byteorder);
!       abort ();
!     }
!
!   if (! ((header.byteorder == BFD_ENDIAN_BIG
! 	  && abfd->xvec->byteorder == BFD_ENDIAN_BIG
! 	  && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
! 	 || (header.byteorder == BFD_ENDIAN_LITTLE
! 	     && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
! 	     && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
!     goto wrong;
!
!   if (header.filetype != BFD_MACH_O_MH_CORE)
!     goto wrong;
!
!   preserve.marker = bfd_zalloc (abfd, sizeof  
(bfd_mach_o_data_struct));
!   if (preserve.marker == NULL
!       || !bfd_preserve_save (abfd, &preserve))
!     goto fail;
!
!   if (bfd_mach_o_scan (abfd, &header,
! 		       (bfd_mach_o_data_struct *) preserve.marker) != 0)
!     goto wrong;
!
!   bfd_preserve_finish (abfd, &preserve);
!   return abfd->xvec;
!
!  wrong:
!   bfd_set_error (bfd_error_wrong_format);

!  fail:
!   if (preserve.marker != NULL)
!     bfd_preserve_restore (abfd, &preserve);
!   return NULL;
   }

   typedef struct mach_o_fat_archentry
--- 2204,2219 ----
     return NULL;
   }

! static const bfd_target *
! bfd_mach_o_gen_object_p (bfd *abfd)
   {
!   return bfd_mach_o_header_p (abfd, 0, 0);
! }

! static const bfd_target *
! bfd_mach_o_gen_core_p (bfd *abfd)
! {
!   return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0);
   }

   typedef struct mach_o_fat_archentry
*************** bfd_mach_o_stack_addr (enum bfd_mach_o_c
*** 2370,2376 ****
       }
   }

! static bfd_boolean
   bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, PTR ptr)
   {
     bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
--- 2522,2528 ----
       }
   }

! bfd_boolean
   bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, PTR ptr)
   {
     bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
Index: mach-o.h
===================================================================
RCS file: /cvs/src/src/bfd/mach-o.h,v
retrieving revision 1.12
diff -c -p -r1.12 mach-o.h
*** mach-o.h	23 Dec 2008 11:32:45 -0000	1.12
--- mach-o.h	2 Jun 2009 14:26:15 -0000
***************
*** 1,5 ****
   /* Mach-O support for BFD.
!    Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008
      Free Software Foundation, Inc.

      This file is part of BFD, the Binary File Descriptor library.
--- 1,5 ----
   /* Mach-O support for BFD.
!    Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008, 2009
      Free Software Foundation, Inc.

      This file is part of BFD, the Binary File Descriptor library.
***************
*** 40,45 ****
--- 40,54 ----
   #define BFD_MACH_O_SYM_NSECT(SYM) (((SYM)->udata.i >> 16) & 0xff)
   #define BFD_MACH_O_SYM_NDESC(SYM) ((SYM)->udata.i & 0xffff)

+ typedef enum bfd_mach_o_mach_header_magic
+ {
+   BFD_MACH_O_MH_MAGIC = 0xfeedface,
+   BFD_MACH_O_MH_CIGAM = 0xcefaedfe,
+   BFD_MACH_O_MH_MAGIC_64 = 0xfeedfacf,
+   BFD_MACH_O_MH_CIGAM_64 = 0xcffaedfe
+ }
+ bfd_mach_o_mach_header_magic;
+
   typedef enum bfd_mach_o_ppc_thread_flavour
   {
     BFD_MACH_O_PPC_THREAD_STATE = 1,
*************** typedef enum bfd_mach_o_cpu_type
*** 134,139 ****
--- 143,154 ----
   }
   bfd_mach_o_cpu_type;

+ typedef enum bfd_mach_o_cpu_subtype
+ {
+   BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3
+ }
+ bfd_mach_o_cpu_subtype;
+
   typedef enum bfd_mach_o_filetype
   {
     BFD_MACH_O_MH_OBJECT = 1,
*************** bfd_mach_o_section_type;
*** 225,232 ****
   /* Section contains only true machine instructions.  */
   #define BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS 0x80000000

- typedef unsigned long bfd_mach_o_cpu_subtype;
-
   typedef struct bfd_mach_o_header
   {
     unsigned long magic;
--- 240,245 ----
*************** typedef struct bfd_mach_o_header
*** 243,248 ****
--- 256,264 ----
   }
   bfd_mach_o_header;

+ #define BFD_MACH_O_HEADER_SIZE 28
+ #define BFD_MACH_O_HEADER_64_SIZE 32
+
   typedef struct bfd_mach_o_section
   {
     asection *bfdsection;
*************** typedef struct bfd_mach_o_section
*** 260,265 ****
--- 276,283 ----
     unsigned long reserved3;
   }
   bfd_mach_o_section;
+ #define BFD_MACH_O_SECTION_SIZE 68
+ #define BFD_MACH_O_SECTION_64_SIZE 80

   typedef struct bfd_mach_o_segment_command
   {
*************** typedef struct bfd_mach_o_segment_comman
*** 276,281 ****
--- 294,301 ----
     asection *segment;
   }
   bfd_mach_o_segment_command;
+ #define BFD_MACH_O_LC_SEGMENT_SIZE 56
+ #define BFD_MACH_O_LC_SEGMENT_64_SIZE 72

   /* Protection flags.  */
   #define BFD_MACH_O_PROT_READ    0x01
*************** bfd_mach_o_uuid_command;
*** 506,512 ****
   typedef struct bfd_mach_o_load_command
   {
     bfd_mach_o_load_command_type type;
!   unsigned int type_required;
     bfd_vma offset;
     bfd_vma len;
     union
--- 526,532 ----
   typedef struct bfd_mach_o_load_command
   {
     bfd_mach_o_load_command_type type;
!   bfd_boolean type_required;
     bfd_vma offset;
     bfd_vma len;
     union
*************** mach_o_data_struct;
*** 540,565 ****

   typedef struct mach_o_data_struct bfd_mach_o_data_struct;

! bfd_boolean        bfd_mach_o_valid  (bfd *);
! int                bfd_mach_o_scan_read_symtab_symbol        (bfd *,  
bfd_mach_o_symtab_command *, asymbol *, unsigned long);
! int                bfd_mach_o_scan_read_symtab_strtab        (bfd *,  
bfd_mach_o_symtab_command *);
! int                bfd_mach_o_scan_read_symtab_symbols       (bfd *,  
bfd_mach_o_symtab_command *);
! int                bfd_mach_o_scan_read_dysymtab_symbol      (bfd *,  
bfd_mach_o_dysymtab_command *, bfd_mach_o_symtab_command *, 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                       (bfd *);
! const bfd_target * bfd_mach_o_object_p                       (bfd *);
! const bfd_target * bfd_mach_o_core_p                         (bfd *);
! const bfd_target * bfd_mach_o_archive_p                      (bfd *);
! bfd *              bfd_mach_o_openr_next_archived_file       (bfd *,  
bfd *);
! 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 **);
! 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 *);
! char *             bfd_mach_o_core_file_failing_command      (bfd *);
! int                bfd_mach_o_core_file_failing_signal       (bfd *);
! bfd_boolean        bfd_mach_o_core_file_matches_executable_p (bfd *,  
bfd *);
   bfd *bfd_mach_o_fat_extract (bfd *, bfd_format , const  
bfd_arch_info_type *);

   extern const bfd_target mach_o_be_vec;
   extern const bfd_target mach_o_le_vec;
--- 560,603 ----

   typedef struct mach_o_data_struct bfd_mach_o_data_struct;

! bfd_boolean bfd_mach_o_valid (bfd *);
! int bfd_mach_o_scan_read_symtab_symbol (bfd *,  
bfd_mach_o_symtab_command *, asymbol *, unsigned long);
! int bfd_mach_o_scan_read_symtab_strtab (bfd *,  
bfd_mach_o_symtab_command *);
! int bfd_mach_o_scan_read_symtab_symbols (bfd *,  
bfd_mach_o_symtab_command *);
! int bfd_mach_o_scan_read_dysymtab_symbol (bfd *,  
bfd_mach_o_dysymtab_command *, bfd_mach_o_symtab_command *, 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 *);
! const bfd_target *bfd_mach_o_archive_p (bfd *);
! bfd *bfd_mach_o_openr_next_archived_file (bfd *, bfd *);
! 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_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 *);
! long bfd_mach_o_get_symtab_upper_bound (bfd *);
! long bfd_mach_o_canonicalize_symtab (bfd *, 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);
! 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 *);
! char *bfd_mach_o_core_file_failing_command (bfd *);
! int bfd_mach_o_core_file_failing_signal (bfd *);
! bfd_boolean bfd_mach_o_core_file_matches_executable_p (bfd *, bfd *);
   bfd *bfd_mach_o_fat_extract (bfd *, bfd_format , const  
bfd_arch_info_type *);
+ const bfd_target *bfd_mach_o_header_p (bfd *, bfd_mach_o_filetype,
+                                        bfd_mach_o_cpu_type);
+ bfd_boolean bfd_mach_o_build_commands (bfd *abfd);
+ bfd_boolean bfd_mach_o_set_section_contents (bfd *, asection *,  
const void *,
+                                              file_ptr, bfd_size_type);

   extern const bfd_target mach_o_be_vec;
   extern const bfd_target mach_o_le_vec;
Index: targets.c
===================================================================
RCS file: /cvs/src/src/bfd/targets.c,v
retrieving revision 1.173
diff -c -p -r1.173 targets.c
*** targets.c	28 May 2009 11:30:49 -0000	1.173
--- targets.c	2 Jun 2009 14:26:15 -0000
*************** extern const bfd_target m88kopenbsd_vec;
*** 747,752 ****
--- 747,753 ----
   extern const bfd_target mach_o_be_vec;
   extern const bfd_target mach_o_le_vec;
   extern const bfd_target mach_o_fat_vec;
+ extern const bfd_target mach_o_i386_vec;
   extern const bfd_target maxqcoff_vec;
   extern const bfd_target mcore_pe_big_vec;
   extern const bfd_target mcore_pe_little_vec;
*************** static const bfd_target * const _bfd_tar
*** 1115,1120 ****
--- 1116,1122 ----
   	&mach_o_be_vec,
   	&mach_o_le_vec,
   	&mach_o_fat_vec,
+ 	&mach_o_i386_vec,
   	&maxqcoff_vec,
   	&mcore_pe_big_vec,
   	&mcore_pe_little_vec,
*** /dev/null	Tue Jun  2 16:19:02 2009
--- mach-o-i386.c	Tue Jun  2 10:26:16 2009
***************
*** 0 ****
--- 1,69 ----
+ /* Intel i386 Mach-O support for BFD.
+    Copyright 2009
+    Free Software Foundation, Inc.
+
+    This file is part of BFD, the Binary File Descriptor library.
+
+    This program is free software; you can redistribute it and/or  
modify
+    it under the terms of the GNU General Public License as published  
by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+    MA 02110-1301, USA.  */
+
+ #include "sysdep.h"
+ #include "mach-o.h"
+ #include "bfd.h"
+ #include "libbfd.h"
+ #include "libiberty.h"
+
+ #define bfd_mach_o_object_p bfd_mach_o_i386_object_p
+ #define bfd_mach_o_core_p bfd_mach_o_i386_core_p
+ #define bfd_mach_o_mkobject bfd_mach_o_i386_mkobject
+
+ static const bfd_target *
+ bfd_mach_o_i386_object_p (bfd *abfd)
+ {
+   return bfd_mach_o_header_p (abfd, 0, BFD_MACH_O_CPU_TYPE_I386);
+ }
+
+ static const bfd_target *
+ bfd_mach_o_i386_core_p (bfd *abfd)
+ {
+   return bfd_mach_o_header_p (abfd,
+                               BFD_MACH_O_MH_CORE,  
BFD_MACH_O_CPU_TYPE_I386);
+ }
+
+ static bfd_boolean
+ bfd_mach_o_i386_mkobject (bfd *abfd)
+ {
+   bfd_mach_o_data_struct *mdata;
+
+   if (!bfd_mach_o_mkobject_init (abfd))
+     return FALSE;
+
+   mdata = abfd->tdata.mach_o_data;
+   mdata->header.magic = BFD_MACH_O_MH_MAGIC;
+   mdata->header.cputype = BFD_MACH_O_CPU_TYPE_I386;
+   mdata->header.cpusubtype = BFD_MACH_O_CPU_SUBTYPE_X86_ALL;
+   mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
+   mdata->header.byteorder = BFD_ENDIAN_LITTLE;
+   mdata->header.version = 1;
+
+   return TRUE;
+ }
+
+ #define TARGET_NAME 		mach_o_i386_vec
+ #define TARGET_STRING 		"mach-o-i386"
+ #define TARGET_BIG_ENDIAN 	0
+ #define TARGET_ARCHIVE 		0
+
+ #include "mach-o-target.c"

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Patch] Mach-O: add write capability
  2009-06-02 14:41 [Patch] Mach-O: add write capability Tristan Gingold
@ 2009-06-05 21:21 ` Jan Kratochvil
  2009-06-06  1:16   ` Alan Modra
  0 siblings, 1 reply; 4+ messages in thread
From: Jan Kratochvil @ 2009-06-05 21:21 UTC (permalink / raw)
  To: Tristan Gingold; +Cc: Binutils

On Tue, 02 Jun 2009 16:40:33 +0200, Tristan Gingold wrote:
> I did some manual checks to test this new feature.

With --enable-targets=all standard x86_64 GDB build broke now:

../bfd/libbfd.a(targets.o):(.rodata+0x618): undefined reference to `mach_o_i386_vec'
../bfd/libbfd.a(targets.o):(.rodata+0x29c8): undefined reference to `mach_o_i386_vec'
collect2: ld returned 1 exit status

(specifically tried ./configure --enable-64-bit-bfd --enable-targets=all
--enable-static --disable-shared --enable-debug)


OK to check-in?


Regards,
Jan


2009-06-05  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* Makefile.am: Run "make dep-am".
	(BFD32_BACKENDS): Add mach-o-i386.lo.
	(BFD32_BACKENDS_CFILES): Add mach-o-i386.c.
	* Makefile.in: Regenerate.

--- bfd/Makefile.am	4 Jun 2009 06:51:11 -0000	1.230
+++ bfd/Makefile.am	5 Jun 2009 21:16:10 -0000
@@ -333,6 +333,7 @@ BFD32_BACKENDS = \
 	m88kmach3.lo \
 	m88kopenbsd.lo \
 	mach-o.lo \
+	mach-o-i386.lo \
 	mipsbsd.lo \
 	newsos3.lo \
 	nlm.lo \
@@ -514,6 +515,7 @@ BFD32_BACKENDS_CFILES = \
 	m88kmach3.c \
 	m88kopenbsd.c \
 	mach-o.c \
+	mach-o-i386.c \
 	mipsbsd.c \
 	newsos3.c \
 	nlm.c \
@@ -3090,6 +3092,13 @@ mach-o.lo: \
   $(INCDIR)/libiberty.h \
   mach-o-target.c \
   mach-o.h
+mach-o-i386.lo: \
+  mach-o-i386.c \
+  $(INCDIR)/filenames.h \
+  $(INCDIR)/hashtab.h \
+  $(INCDIR)/libiberty.h \
+  mach-o-target.c \
+  mach-o.h
 mipsbsd.lo: \
   mipsbsd.c \
   $(INCDIR)/aout/aout64.h \
--- bfd/Makefile.in	4 Jun 2009 06:51:11 -0000	1.254
+++ bfd/Makefile.in	5 Jun 2009 21:16:10 -0000
@@ -604,6 +604,7 @@ BFD32_BACKENDS = \
 	m88kmach3.lo \
 	m88kopenbsd.lo \
 	mach-o.lo \
+	mach-o-i386.lo \
 	mipsbsd.lo \
 	newsos3.lo \
 	nlm.lo \
@@ -785,6 +786,7 @@ BFD32_BACKENDS_CFILES = \
 	m88kmach3.c \
 	m88kopenbsd.c \
 	mach-o.c \
+	mach-o-i386.c \
 	mipsbsd.c \
 	newsos3.c \
 	nlm.c \
@@ -3691,6 +3693,13 @@ mach-o.lo: \
   $(INCDIR)/libiberty.h \
   mach-o-target.c \
   mach-o.h
+mach-o-i386.lo: \
+  mach-o-i386.c \
+  $(INCDIR)/filenames.h \
+  $(INCDIR)/hashtab.h \
+  $(INCDIR)/libiberty.h \
+  mach-o-target.c \
+  mach-o.h
 mipsbsd.lo: \
   mipsbsd.c \
   $(INCDIR)/aout/aout64.h \

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Patch] Mach-O: add write capability
  2009-06-05 21:21 ` Jan Kratochvil
@ 2009-06-06  1:16   ` Alan Modra
  2009-06-06  7:50     ` Jan Kratochvil
  0 siblings, 1 reply; 4+ messages in thread
From: Alan Modra @ 2009-06-06  1:16 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: Tristan Gingold, Binutils

On Fri, Jun 05, 2009 at 11:21:11PM +0200, Jan Kratochvil wrote:
> 	* Makefile.am: Run "make dep-am".
> 	(BFD32_BACKENDS): Add mach-o-i386.lo.
> 	(BFD32_BACKENDS_CFILES): Add mach-o-i386.c.
> 	* Makefile.in: Regenerate.

OK.

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Patch] Mach-O: add write capability
  2009-06-06  1:16   ` Alan Modra
@ 2009-06-06  7:50     ` Jan Kratochvil
  0 siblings, 0 replies; 4+ messages in thread
From: Jan Kratochvil @ 2009-06-06  7:50 UTC (permalink / raw)
  To: Binutils; +Cc: Tristan Gingold, Alan Modra

On Sat, 06 Jun 2009 03:16:07 +0200, Alan Modra wrote:
> On Fri, Jun 05, 2009 at 11:21:11PM +0200, Jan Kratochvil wrote:
> > 	* Makefile.am: Run "make dep-am".
> > 	(BFD32_BACKENDS): Add mach-o-i386.lo.
> > 	(BFD32_BACKENDS_CFILES): Add mach-o-i386.c.
> > 	* Makefile.in: Regenerate.
> 
> OK.

Checked-in:
	http://sourceware.org/ml/binutils-cvs/2009-06/msg00044.html


Thanks,
Jan

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2009-06-06  7:50 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-06-02 14:41 [Patch] Mach-O: add write capability Tristan Gingold
2009-06-05 21:21 ` Jan Kratochvil
2009-06-06  1:16   ` Alan Modra
2009-06-06  7:50     ` Jan Kratochvil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).