This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

revised : [Patch mach-o/gas] make section type names target-dependent.


when I merged this back into my symbol-qualifier branch, I found it was not improving error handling at all - owing to a typo.
I've simplified it now - there seems no point in carrying on the parsing once the line is known to be broken.


ChangeLogs and general comments the same.

On 16 Dec 2011, at 20:34, Iain Sandoe wrote:

I am trying to test the four main Darwin targets as I implement things ..
.. the Idea being that, one day, we will simply be able to enable them all in configure...


Testing my current stuff (for symbol type qualifiers) reminded me that some section types are not applicable to all targets.
(At present, specifically, that means that x86-64 doesn't support symbol stubs, or {non,}lazy_symbol_stubs).


The patch below checks for a target-specific table ahead of the generic one.
I followed the current style of printing in binutils/od-macho.c and parsing in bfd/mach-o.c although I wonder if it might be more obvious to put them both back into bfd/mach-o.c and just publish the accessor routines.

OK? Iain

bfd:

* mach-o-i386.c (mach_o_i386_section_type_names): New.
(bfd_mach_o_tgt_section_type_names): Use mach_o_i386_section_type_names.
* mach-o-target.c (bfd_mach_o_tgt_section_type_names): New initializer.
* mach-o-x86-64.c (bfd_mach_o_tgt_section_type_names): Initialize to NULL.
* mach-o.c (bfd_mach_o_section_type_name): Remove target-dependent entries.
(mach_o_default_additional_section_type_names): New.
(bfd_mach_o_get_section_type_from_name): Look for target-specific entries.
(bfd_mach_o_tgt_section_type_names): Use default additions for {le,be}_vec.
* mach-o.h (bfd_mach_o_get_section_type_from_name): Alter definition to include
bfd.


binutils:

* od-macho.c (dump_section): Account for target-dependent section types.

gas:

* config/obj-macho.c (obj_mach_o_section): Account for target- dependent section
types. Improve error handling when wrong section types/attributes are specified.


gas/testsuite:

	* gas/mach-o/err-sections-1.s: New.
	* gas/mach-o/err-sections-2.s: New.
	* gas/mach-o/sections-3.d: New.
	* gas/mach-o/sections-3.s: New.

bfd/mach-o-i386.c | 9 ++++++
bfd/mach-o-target.c | 3 +-
bfd/mach-o-x86-64.c | 1 +
bfd/mach-o.c | 22 ++++++++++++---
bfd/mach-o.h | 3 +-
binutils/od-macho.c | 16 ++++++++---
gas/config/obj-macho.c | 41 ++++++++++++++++++ +---------
gas/testsuite/gas/mach-o/err-sections-1.s | 9 ++++++
gas/testsuite/gas/mach-o/err-sections-2.s | 9 ++++++
gas/testsuite/gas/mach-o/sections-3.d | 19 +++++++++++++
gas/testsuite/gas/mach-o/sections-3.s | 7 +++++
11 files changed, 115 insertions(+), 24 deletions(-)


diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c
index 3dadcb8..2d92075 100644
--- a/bfd/mach-o-i386.c
+++ b/bfd/mach-o-i386.c
@@ -333,11 +333,20 @@ const mach_o_segment_name_xlat mach_o_i386_segsec_names_xlat[] =
{ NULL, NULL }
};


+const bfd_mach_o_xlat_name mach_o_i386_section_type_names[] =
+{
+  { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
+  { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
+  { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
+  { NULL, 0}
+};
+
 #define bfd_mach_o_swap_reloc_in bfd_mach_o_i386_swap_reloc_in
 #define bfd_mach_o_swap_reloc_out bfd_mach_o_i386_swap_reloc_out
 #define bfd_mach_o_print_thread bfd_mach_o_i386_print_thread

#define bfd_mach_o_tgt_seg_table mach_o_i386_segsec_names_xlat
+#define bfd_mach_o_tgt_section_type_names mach_o_i386_section_type_names


#define bfd_mach_o_bfd_reloc_type_lookup bfd_mach_o_i386_bfd_reloc_type_lookup
#define bfd_mach_o_bfd_reloc_name_lookup bfd_mach_o_i386_bfd_reloc_name_lookup
diff --git a/bfd/mach-o-target.c b/bfd/mach-o-target.c
index 4aeb920..3d4b494 100644
--- a/bfd/mach-o-target.c
+++ b/bfd/mach-o-target.c
@@ -96,7 +96,8 @@ static const bfd_mach_o_backend_data TARGET_NAME_BACKEND =
bfd_mach_o_swap_reloc_in,
bfd_mach_o_swap_reloc_out,
bfd_mach_o_print_thread,
- bfd_mach_o_tgt_seg_table
+ bfd_mach_o_tgt_seg_table,
+ bfd_mach_o_tgt_section_type_names
};


const bfd_target TARGET_NAME =
diff --git a/bfd/mach-o-x86-64.c b/bfd/mach-o-x86-64.c
index c86efb7..0abd319 100644
--- a/bfd/mach-o-x86-64.c
+++ b/bfd/mach-o-x86-64.c
@@ -288,6 +288,7 @@ bfd_mach_o_x86_64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
#define bfd_mach_o_bfd_reloc_name_lookup bfd_mach_o_x86_64_bfd_reloc_name_lookup
#define bfd_mach_o_print_thread NULL
#define bfd_mach_o_tgt_seg_table NULL
+#define bfd_mach_o_tgt_section_type_names NULL


#define TARGET_NAME mach_o_x86_64_vec
#define TARGET_STRING "mach-o-x86-64"
diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index dca8601..edd5ce5 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -3558,9 +3558,6 @@ const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
{ "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
{ "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
{ "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
- { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
- { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
- { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
{ "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
{ "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
{ "coalesced", BFD_MACH_O_S_COALESCED},
@@ -3568,7 +3565,6 @@ const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
{ "interposing", BFD_MACH_O_S_INTERPOSING},
{ "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
{ "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
- { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
{ "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
{ NULL, 0}
};
@@ -3589,12 +3585,27 @@ const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
{ NULL, 0}
};


+const bfd_mach_o_xlat_name mach_o_default_additional_section_type_names[] =
+{
+ { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
+ { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
+ { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
+ { NULL, 0}
+};
+
/* Get the section type from NAME. Return 256 if NAME is unknown. */


 unsigned int
-bfd_mach_o_get_section_type_from_name (const char *name)
+bfd_mach_o_get_section_type_from_name (bfd *abfd, const char *name)
 {
   const bfd_mach_o_xlat_name *x;
+  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
+
+  /* First try any target-specific translations defined...  */
+  if (bed->section_type_names)
+    for (x = bed->section_type_names; x->name; x++)
+      if (strcmp (x->name, name) == 0)
+	return x->val;

for (x = bfd_mach_o_section_type_name; x->name; x++)
if (strcmp (x->name, name) == 0)
@@ -3785,6 +3796,7 @@ bfd_boolean bfd_mach_o_free_cached_info (bfd *abfd)
#define bfd_mach_o_swap_reloc_out NULL
#define bfd_mach_o_print_thread NULL
#define bfd_mach_o_tgt_seg_table NULL
+#define bfd_mach_o_tgt_section_type_names mach_o_default_additional_section_type_names


#define TARGET_NAME mach_o_be_vec
#define TARGET_STRING "mach-o-be"
diff --git a/bfd/mach-o.h b/bfd/mach-o.h
index 23c3e1c..af688c2 100644
--- a/bfd/mach-o.h
+++ b/bfd/mach-o.h
@@ -584,7 +584,7 @@ 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_convert_section_name_to_bfd (bfd *, const char *, const char *,
@@ -636,6 +636,7 @@ typedef struct bfd_mach_o_backend_data
bfd_boolean (*_bfd_mach_o_print_thread)(bfd *, bfd_mach_o_thread_flavour *,
void *, char *);
const mach_o_segment_name_xlat *segsec_names_xlat;
+ const bfd_mach_o_xlat_name *section_type_names;
}
bfd_mach_o_backend_data;


diff --git a/binutils/od-macho.c b/binutils/od-macho.c
index c5e315d..b13d2f9 100644
--- a/binutils/od-macho.c
+++ b/binutils/od-macho.c
@@ -314,8 +314,12 @@ dump_section_map (bfd *abfd)
 }

static void
-dump_section (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_section *sec)
+dump_section (bfd *abfd, bfd_mach_o_section *sec)
{
+ bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
+ const char * secttype_name = NULL;
+ unsigned typ = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
+
printf (" Section: %-16s %-16s (bfdname: %s)\n",
sec->sectname, sec->segname, sec->bfdsection->name);
printf (" addr: ");
@@ -329,9 +333,13 @@ dump_section (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_section *sec)
printf (" nreloc: %lu reloff: ", sec->nreloc);
printf_vma (sec->reloff);
printf ("\n");
- printf (" flags: %08lx (type: %s", sec->flags,
- bfd_mach_o_get_name (bfd_mach_o_section_type_name,
- sec->flags & BFD_MACH_O_SECTION_TYPE_MASK));
+ if (bed->section_type_names != NULL)
+ secttype_name = bfd_mach_o_get_name_or_null (bed- >section_type_names,
+ typ);
+ if (secttype_name == NULL)
+ secttype_name = bfd_mach_o_get_name (bfd_mach_o_section_type_name,typ);
+
+ printf (" flags: %08lx (type: %s", sec->flags, secttype_name);
printf (" attr: ");
bfd_mach_o_print_flags (bfd_mach_o_section_attribute_name,
sec->flags & BFD_MACH_O_SECTION_ATTRIBUTES_MASK);
diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c
index 0852cde..be1c9ff 100644
--- a/gas/config/obj-macho.c
+++ b/gas/config/obj-macho.c
@@ -169,6 +169,10 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
char segname[17];
char sectname[17];


+#ifdef md_flush_pending_output
+  md_flush_pending_output ();
+#endif
+
   /* Zero-length segment and section names are allowed.  */
   /* Parse segment name.  */
   memset (segname, 0, sizeof(segname));
@@ -203,16 +207,18 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)

       /* Temporarily make a string from the token.  */
       p[len] = 0;
-      sectype = bfd_mach_o_get_section_type_from_name (p);
+      sectype = bfd_mach_o_get_section_type_from_name (stdoutput, p);
       if (sectype > 255) /* Max Section ID == 255.  */
         {
           as_bad (_("unknown or invalid section type '%s'"), p);
-          sectype = BFD_MACH_O_S_REGULAR;
+	  p[len] = tmpc;
+	  ignore_rest_of_line ();
+	  return;
         }
       else
 	sectype_given = 1;
       /* Restore.  */
-      tmpc = p[len];
+      p[len] = tmpc;

/* Parse attributes.
TODO: check validity of attributes for section type. */
@@ -241,7 +247,12 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
p[len] ='\0';
attr = bfd_mach_o_get_section_attribute_from_name (p);
if (attr == -1)
- as_bad (_("unknown or invalid section attribute '%s'"), p);
+ {
+ as_bad (_("unknown or invalid section attribute '%s'"), p);
+ p[len] = tmpc;
+ ignore_rest_of_line ();
+ return;
+ }
else
{
secattr_given = 1;
@@ -253,19 +264,26 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
while (*input_line_pointer == '+');


           /* Parse sizeof_stub.  */
-          if (*input_line_pointer == ',')
+          if (secattr_given && *input_line_pointer == ',')
             {
               if (sectype != BFD_MACH_O_S_SYMBOL_STUBS)
-                as_bad (_("unexpected sizeof_stub expression"));
+                {
+		  as_bad (_("unexpected section size information"));
+		  ignore_rest_of_line ();
+		  return;
+		}

input_line_pointer++;
sizeof_stub = get_absolute_expression ();
}
- else if (sectype == BFD_MACH_O_S_SYMBOL_STUBS)
- as_bad (_("missing sizeof_stub expression"));
+ else if (secattr_given && sectype == BFD_MACH_O_S_SYMBOL_STUBS)
+ {
+ as_bad (_("missing sizeof_stub expression"));
+ ignore_rest_of_line ();
+ return;
+ }
}
}
- demand_empty_rest_of_line ();


flags = SEC_NO_FLAGS;
/* This provides default bfd flags and default mach-o section type and
@@ -296,10 +314,6 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
name = n;
}


-#ifdef md_flush_pending_output
-  md_flush_pending_output ();
-#endif
-
   /* Sub-segments don't exists as is on Mach-O.  */
   sec = subseg_new (name, 0);

@@ -334,6 +348,7 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
 	  || msect->flags != (secattr | sectype))
 	as_warn (_("Ignoring changed section attributes for %s"), name);
     }
+  demand_empty_rest_of_line ();
 }

static segT
diff --git a/gas/testsuite/gas/mach-o/err-sections-1.s b/gas/testsuite/ gas/mach-o/err-sections-1.s
new file mode 100644
index 0000000..99447a7
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/err-sections-1.s
@@ -0,0 +1,9 @@
+# { dg-do assemble { target x86_64-*-darwin* } }
+
+ .section __a,__b,symbol_stubs,strip_static_syms,4
+ .section __a,__c,lazy_symbol_pointers,strip_static_syms,4
+ .section __a,__d,non_lazy_symbol_pointers,strip_static_syms,4
+
+# { dg-error "unknown or invalid section type .symbol_stubs." "" { target x86_64-*-darwin* } 3 }
+# { dg-error "unknown or invalid section type .lazy_symbol_pointers." "" { target x86_64-*-darwin* } 4 }
+# { dg-error "unknown or invalid section type .non_lazy_symbol_pointers." "" { target x86_64-*-darwin* } 5 }
diff --git a/gas/testsuite/gas/mach-o/err-sections-2.s b/gas/testsuite/ gas/mach-o/err-sections-2.s
new file mode 100644
index 0000000..3343066
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/err-sections-2.s
@@ -0,0 +1,9 @@
+# { dg-do assemble { target x86_64-*-darwin* } }
+
+ .symbol_stub
+ .lazy_symbol_pointer
+ .non_lazy_symbol_pointer
+
+# { dg-error ".symbol_stub is not used for the selected target" "" { target x86_64-*-darwin* } 3 }
+# { dg-error ".lazy_symbol_pointer is not used for the selected target" "" { target x86_64-*-darwin* } 4 }
+# { dg-error ".non_lazy_symbol_pointer is not used for the selected target" "" { target x86_64-*-darwin* } 5 }
diff --git a/gas/testsuite/gas/mach-o/sections-3.d b/gas/testsuite/gas/ mach-o/sections-3.d
new file mode 100644
index 0000000..9d1daf4
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/sections-3.d
@@ -0,0 +1,19 @@
+#objdump: -P section
+#not-target: x86_64-*-darwin*
+.*: +file format mach-o.*
+#...
+ Section: __symbol_stub __TEXT.*\(bfdname: .symbol_stub\)
+ addr: (00000000)?00000000 size: (00000000)?00000000 offset: (00000000)?00000000
+ align: 0 nreloc: 0 reloff: (00000000)?00000000
+ flags: 80000008 \(type: symbol_stubs attr: pure_instructions\)
+ first indirect sym: 0 \(0 entries\) stub size: (16|20) reserved3: 0x0
+ Section: __la_symbol_ptr __DATA.*\(bfdname: .lazy_symbol_pointer\)
+ addr: (00000000)?00000000 size: (00000000)?00000000 offset: (00000000)?00000000
+ align: 2 nreloc: 0 reloff: (00000000)?00000000
+ flags: 00000007 \(type: lazy_symbol_pointers attr: -\)
+ first indirect sym: 0 \(0 entries\) reserved2: 0x0 reserved3: 0x0
+ Section: __nl_symbol_ptr __DATA.*\(bfdname: .non_lazy_symbol_pointer \)
+ addr: (00000000)?00000000 size: (00000000)?00000000 offset: (00000000)?00000000
+ align: 2 nreloc: 0 reloff: (00000000)?00000000
+ flags: 00000006 \(type: non_lazy_symbol_pointers attr: -\)
+ first indirect sym: 0 \(0 entries\) reserved2: 0x0 reserved3: 0x0
diff --git a/gas/testsuite/gas/mach-o/sections-3.s b/gas/testsuite/gas/ mach-o/sections-3.s
new file mode 100644
index 0000000..17fae52
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/sections-3.s
@@ -0,0 +1,7 @@
+
+ .symbol_stub
+
+ .lazy_symbol_pointer
+
+ .non_lazy_symbol_pointer
+



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]