summaryrefslogtreecommitdiff
path: root/libiberty/simple-object-elf.c
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2010-11-17 02:03:43 +0000
committerDJ Delorie <dj@redhat.com>2010-11-17 02:03:43 +0000
commitf9e6589d8755e896e2b48ebafad988e572eed2e7 (patch)
tree2ca17c836711a86d1c79c82930b3215c4700b950 /libiberty/simple-object-elf.c
parentab8056e082820630f09bde048adbebbee05d6ddb (diff)
downloadbinutils-gdb-f9e6589d8755e896e2b48ebafad988e572eed2e7.tar.gz
merge from gcc
Diffstat (limited to 'libiberty/simple-object-elf.c')
-rw-r--r--libiberty/simple-object-elf.c57
1 files changed, 47 insertions, 10 deletions
diff --git a/libiberty/simple-object-elf.c b/libiberty/simple-object-elf.c
index 5b8cfba1cd6..4196c537cde 100644
--- a/libiberty/simple-object-elf.c
+++ b/libiberty/simple-object-elf.c
@@ -115,6 +115,11 @@ typedef struct {
#define ET_REL 1 /* Relocatable file */
+/* Values for e_machine field of Ehdr. */
+
+#define EM_SPARC 2 /* SUN SPARC */
+#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
+
/* Special section index values. */
#define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */
@@ -604,20 +609,52 @@ simple_object_elf_release_read (void *data)
/* Compare two attributes structures. */
static const char *
-simple_object_elf_attributes_compare (void *data1, void *data2, int *err)
+simple_object_elf_attributes_merge (void *todata, void *fromdata, int *err)
{
- struct simple_object_elf_attributes *attrs1 =
- (struct simple_object_elf_attributes *) data1;
- struct simple_object_elf_attributes *attrs2 =
- (struct simple_object_elf_attributes *) data2;
-
- if (attrs1->ei_data != attrs2->ei_data
- || attrs1->ei_class != attrs2->ei_class
- || attrs1->machine != attrs2->machine)
+ struct simple_object_elf_attributes *to =
+ (struct simple_object_elf_attributes *) todata;
+ struct simple_object_elf_attributes *from =
+ (struct simple_object_elf_attributes *) fromdata;
+
+ if (to->ei_data != from->ei_data || to->ei_class != from->ei_class)
{
*err = 0;
return "ELF object format mismatch";
}
+
+ if (to->machine != from->machine)
+ {
+ int ok;
+
+ /* EM_SPARC and EM_SPARC32PLUS are compatible and force an
+ output of EM_SPARC32PLUS. */
+ ok = 0;
+ switch (to->machine)
+ {
+ case EM_SPARC:
+ if (from->machine == EM_SPARC32PLUS)
+ {
+ to->machine = from->machine;
+ ok = 1;
+ }
+ break;
+
+ case EM_SPARC32PLUS:
+ if (from->machine == EM_SPARC)
+ ok = 1;
+ break;
+
+ default:
+ break;
+ }
+
+ if (!ok)
+ {
+ *err = 0;
+ return "ELF machine number mismatch";
+ }
+ }
+
return NULL;
}
@@ -908,7 +945,7 @@ const struct simple_object_functions simple_object_elf_functions =
simple_object_elf_find_sections,
simple_object_elf_fetch_attributes,
simple_object_elf_release_read,
- simple_object_elf_attributes_compare,
+ simple_object_elf_attributes_merge,
simple_object_elf_release_attributes,
simple_object_elf_start_write,
simple_object_elf_write_to_file,