summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXianmiao Qu <cooper.qu@linux.alibaba.com>2023-01-17 11:43:16 +0000
committerNick Clifton <nickc@redhat.com>2023-01-17 11:43:16 +0000
commitfd1b3e0e8dbf5313bededeab9c9c4ed2da5a0693 (patch)
tree7823321acac9e0db0dc3fdff4c6a0086aa8cbd23
parent1609cd6c5b189536d51ac98359b162061cb3bb1d (diff)
downloadbinutils-gdb-fd1b3e0e8dbf5313bededeab9c9c4ed2da5a0693.tar.gz
C-SKY: Fix machine flag.
* elf32-csky.c (elf32_csky_merge_attributes): Don't save and restore the ARCH attribute, it will actually clear the ARCH attribute. (csky_elf_merge_private_bfd_data): Store the machine flag correctly.
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf32-csky.c21
2 files changed, 14 insertions, 15 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ba44ea53cf7..75a2c4901e2 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2023-01-17 Xianmiao Qu <cooper.qu@linux.alibaba.com>
+
+ * elf32-csky.c (elf32_csky_merge_attributes): Don't save
+ and restore the ARCH attribute, it will actually clear
+ the ARCH attribute.
+ (csky_elf_merge_private_bfd_data): Store the machine flag
+ correctly.
+
2023-01-13 Nick Clifton <nickc@redhat.com>
* po/ro.po: Updated Romainian translation.
diff --git a/bfd/elf32-csky.c b/bfd/elf32-csky.c
index 7e03a3bc44d..3f4277b71db 100644
--- a/bfd/elf32-csky.c
+++ b/bfd/elf32-csky.c
@@ -2892,16 +2892,8 @@ elf32_csky_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
/* This is the first object. Copy the attributes. */
out_attr = elf_known_obj_attributes_proc (obfd);
- /* If Tag_CSKY_CPU_NAME is already set, save it. */
- memcpy (&tattr, &out_attr[Tag_CSKY_ARCH_NAME], sizeof (tattr));
-
_bfd_elf_copy_obj_attributes (ibfd, obfd);
- out_attr = elf_known_obj_attributes_proc (obfd);
-
- /* Restore Tag_CSKY_CPU_NAME. */
- memcpy (&out_attr[Tag_CSKY_ARCH_NAME], &tattr, sizeof (tattr));
-
/* Use the Tag_null value to indicate the attributes have been
initialized. */
out_attr[0].i = 1;
@@ -3066,12 +3058,14 @@ csky_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
old_flags = elf_elfheader (obfd)->e_flags;
out_attr = elf_known_obj_attributes_proc (obfd);
- /* the flags like"e , f ,g ..." , we take collection. */
- newest_flag = (old_flags & (~CSKY_ARCH_MASK))
- | (new_flags & (~CSKY_ARCH_MASK));
+ /* The flags like "e , f ,g ..." , we take collection. */
+ newest_flag = old_flags | new_flags;
sec_name = get_elf_backend_data (ibfd)->obj_attrs_section;
- if (bfd_get_section_by_name (ibfd, sec_name) == NULL)
+
+ if (bfd_get_section_by_name (ibfd, sec_name) == NULL
+ || (new_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK) !=
+ old_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK)))
{
/* Input BFDs have no ".csky.attribute" section. */
new_arch = csky_find_arch_with_eflag (new_flags & CSKY_ARCH_MASK);
@@ -3110,9 +3104,6 @@ csky_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
out_attr[Tag_CSKY_ARCH_NAME].s =
_bfd_elf_attr_strdup (obfd, newest_arch->name);
}
- else
- newest_flag |= ((new_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK))
- | (old_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK)));
}
else
{