elf-attrs.c memory allocation fail

Report errors rather than segfaulting.

bfd/
	* elf-attrs.c (elf_new_obj_attr): Return NULL on bfd_alloc fail.
	(bfd_elf_add_obj_attr_int): Handle NULL return from the above,
	and propagate return to callers.
	(elf_add_obj_attr_string, elf_add_obj_attr_int_string): Likewise.
	(bfd_elf_add_obj_attr_string): Similarly.
	(_bfd_elf_copy_obj_attributes): Report error on alloc fails.
	(_bfd_elf_parse_attributes): Likewise.
	* elf-bfd.h (bfd_elf_add_obj_attr_int): Update prototype.
	(bfd_elf_add_obj_attr_string): Likewise.
	(bfd_elf_add_obj_attr_int_string): Likewise.
gas/
	* config/obj-elf.c (obj_elf_vendor_attribute): Report fatal
	error on out of memory from bfd attribute functions.
	* config/tc-arc.c (arc_set_attribute_int): Likewise.
	(arc_set_attribute_string, arc_set_public_attributes): Likewise.
	* config/tc-arm.c (aeabi_set_attribute_int): Likewise.
	(aeabi_set_attribute_string): Likewise.
	* config/tc-mips.c (mips_md_finish): Likewise.
	* config/tc-msp430.c (msp430_md_finish): Likewise.
	* config/tc-riscv.c (riscv_write_out_attrs): Likewise.
	* config/tc-sparc.c (sparc_md_finish): Likewise.
	* config/tc-tic6x.c (tic6x_set_attribute_int): Likewise.
	* config/tc-csky.c (md_begin): Likewise.
	(set_csky_attribute): Return ok status.
This commit is contained in:
Alan Modra 2023-09-19 09:39:31 +09:30
parent a56e5dce69
commit a1d1634d00
11 changed files with 199 additions and 112 deletions

View file

@ -247,6 +247,8 @@ elf_new_obj_attr (bfd *abfd, int vendor, unsigned int tag)
/* Create a new tag. */
list = (obj_attribute_list *)
bfd_alloc (abfd, sizeof (obj_attribute_list));
if (list == NULL)
return NULL;
memset (list, 0, sizeof (obj_attribute_list));
list->tag = tag;
/* Keep the tag list in order. */
@ -292,14 +294,18 @@ bfd_elf_get_obj_attr_int (bfd *abfd, int vendor, unsigned int tag)
}
/* Add an integer object attribute. */
void
obj_attribute *
bfd_elf_add_obj_attr_int (bfd *abfd, int vendor, unsigned int tag, unsigned int i)
{
obj_attribute *attr;
attr = elf_new_obj_attr (abfd, vendor, tag);
attr->type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
attr->i = i;
if (attr != NULL)
{
attr->type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
attr->i = i;
}
return attr;
}
/* Duplicate an object attribute string value. */
@ -330,42 +336,54 @@ _bfd_elf_attr_strdup (bfd *abfd, const char *s)
}
/* Add a string object attribute. */
static void
static obj_attribute *
elf_add_obj_attr_string (bfd *abfd, int vendor, unsigned int tag,
const char *s, const char *end)
{
obj_attribute *attr;
attr = elf_new_obj_attr (abfd, vendor, tag);
attr->type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
attr->s = elf_attr_strdup (abfd, s, end);
if (attr != NULL)
{
attr->type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
attr->s = elf_attr_strdup (abfd, s, end);
if (attr->s == NULL)
return NULL;
}
return attr;
}
void
obj_attribute *
bfd_elf_add_obj_attr_string (bfd *abfd, int vendor, unsigned int tag,
const char *s)
{
elf_add_obj_attr_string (abfd, vendor, tag, s, NULL);
return elf_add_obj_attr_string (abfd, vendor, tag, s, NULL);
}
/* Add a int+string object attribute. */
static void
static obj_attribute *
elf_add_obj_attr_int_string (bfd *abfd, int vendor, unsigned int tag,
unsigned int i, const char *s, const char *end)
{
obj_attribute *attr;
attr = elf_new_obj_attr (abfd, vendor, tag);
attr->type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
attr->i = i;
attr->s = elf_attr_strdup (abfd, s, end);
if (attr != NULL)
{
attr->type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
attr->i = i;
attr->s = elf_attr_strdup (abfd, s, end);
if (attr->s == NULL)
return NULL;
}
return attr;
}
void
obj_attribute *
bfd_elf_add_obj_attr_int_string (bfd *abfd, int vendor, unsigned int tag,
unsigned int i, const char *s)
{
elf_add_obj_attr_int_string (abfd, vendor, tag, i, s, NULL);
return elf_add_obj_attr_int_string (abfd, vendor, tag, i, s, NULL);
}
/* Copy the object attributes from IBFD to OBFD. */
@ -393,7 +411,11 @@ _bfd_elf_copy_obj_attributes (bfd *ibfd, bfd *obfd)
out_attr->type = in_attr->type;
out_attr->i = in_attr->i;
if (in_attr->s && *in_attr->s)
out_attr->s = _bfd_elf_attr_strdup (obfd, in_attr->s);
{
out_attr->s = _bfd_elf_attr_strdup (obfd, in_attr->s);
if (out_attr->s == NULL)
bfd_perror (_("error adding attribute"));
}
in_attr++;
out_attr++;
}
@ -402,23 +424,27 @@ _bfd_elf_copy_obj_attributes (bfd *ibfd, bfd *obfd)
list;
list = list->next)
{
bool ok = false;
in_attr = &list->attr;
switch (in_attr->type & (ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL))
{
case ATTR_TYPE_FLAG_INT_VAL:
bfd_elf_add_obj_attr_int (obfd, vendor, list->tag, in_attr->i);
ok = bfd_elf_add_obj_attr_int (obfd, vendor,
list->tag, in_attr->i);
break;
case ATTR_TYPE_FLAG_STR_VAL:
bfd_elf_add_obj_attr_string (obfd, vendor, list->tag,
in_attr->s);
ok = bfd_elf_add_obj_attr_string (obfd, vendor, list->tag,
in_attr->s);
break;
case ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL:
bfd_elf_add_obj_attr_int_string (obfd, vendor, list->tag,
in_attr->i, in_attr->s);
ok = bfd_elf_add_obj_attr_int_string (obfd, vendor, list->tag,
in_attr->i, in_attr->s);
break;
default:
abort ();
}
if (!ok)
bfd_perror (_("error adding attribute"));
}
}
}
@ -563,6 +589,7 @@ _bfd_elf_parse_attributes (bfd *abfd, Elf_Internal_Shdr * hdr)
while (p < end)
{
int type;
bool ok = false;
tag = _bfd_safe_read_leb128 (abfd, &p, false, end);
type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
@ -570,28 +597,30 @@ _bfd_elf_parse_attributes (bfd *abfd, Elf_Internal_Shdr * hdr)
{
case ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL:
val = _bfd_safe_read_leb128 (abfd, &p, false, end);
elf_add_obj_attr_int_string (abfd, vendor, tag, val,
(char *) p,
(char *) end);
ok = elf_add_obj_attr_int_string (abfd, vendor, tag,
val, (char *) p,
(char *) end);
p += strnlen ((char *) p, end - p);
if (p < end)
p++;
break;
case ATTR_TYPE_FLAG_STR_VAL:
elf_add_obj_attr_string (abfd, vendor, tag,
(char *) p,
(char *) end);
ok = elf_add_obj_attr_string (abfd, vendor, tag,
(char *) p,
(char *) end);
p += strnlen ((char *) p, end - p);
if (p < end)
p++;
break;
case ATTR_TYPE_FLAG_INT_VAL:
val = _bfd_safe_read_leb128 (abfd, &p, false, end);
bfd_elf_add_obj_attr_int (abfd, vendor, tag, val);
ok = bfd_elf_add_obj_attr_int (abfd, vendor, tag, val);
break;
default:
abort ();
}
if (!ok)
bfd_perror (_("error adding attribute"));
}
break;
case Tag_Section:

View file

@ -3009,14 +3009,16 @@ extern bfd *_bfd_elf64_bfd_from_remote_memory
extern bfd_vma bfd_elf_obj_attr_size (bfd *);
extern void bfd_elf_set_obj_attr_contents (bfd *, bfd_byte *, bfd_vma);
extern int bfd_elf_get_obj_attr_int (bfd *, int, unsigned int);
extern void bfd_elf_add_obj_attr_int (bfd *, int, unsigned int, unsigned int);
extern obj_attribute *bfd_elf_add_obj_attr_int
(bfd *, int, unsigned int, unsigned int);
#define bfd_elf_add_proc_attr_int(BFD, TAG, VALUE) \
bfd_elf_add_obj_attr_int ((BFD), OBJ_ATTR_PROC, (TAG), (VALUE))
extern void bfd_elf_add_obj_attr_string (bfd *, int, unsigned int, const char *);
extern obj_attribute *bfd_elf_add_obj_attr_string
(bfd *, int, unsigned int, const char *);
#define bfd_elf_add_proc_attr_string(BFD, TAG, VALUE) \
bfd_elf_add_obj_attr_string ((BFD), OBJ_ATTR_PROC, (TAG), (VALUE))
extern void bfd_elf_add_obj_attr_int_string (bfd *, int, unsigned int,
unsigned int, const char *);
extern obj_attribute *bfd_elf_add_obj_attr_int_string
(bfd *, int, unsigned int, unsigned int, const char *);
#define bfd_elf_add_proc_attr_int_string(BFD, TAG, INTVAL, STRVAL) \
bfd_elf_add_obj_attr_int_string ((BFD), OBJ_ATTR_PROC, (TAG), \
(INTVAL), (STRVAL))

View file

@ -2100,20 +2100,24 @@ obj_elf_vendor_attribute (int vendor)
}
record_attribute (vendor, tag);
bool ok = false;
switch (type & 3)
{
case 3:
bfd_elf_add_obj_attr_int_string (stdoutput, vendor, tag, i, s);
ok = bfd_elf_add_obj_attr_int_string (stdoutput, vendor, tag, i, s);
break;
case 2:
bfd_elf_add_obj_attr_string (stdoutput, vendor, tag, s);
ok = bfd_elf_add_obj_attr_string (stdoutput, vendor, tag, s);
break;
case 1:
bfd_elf_add_obj_attr_int (stdoutput, vendor, tag, i);
ok = bfd_elf_add_obj_attr_int (stdoutput, vendor, tag, i);
break;
default:
abort ();
}
if (!ok)
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
demand_empty_rest_of_line ();
return tag;

View file

@ -4941,7 +4941,9 @@ arc_set_attribute_int (int tag, int value)
if (tag < 1
|| tag >= NUM_KNOWN_OBJ_ATTRIBUTES
|| !attributes_set_explicitly[tag])
bfd_elf_add_proc_attr_int (stdoutput, tag, value);
if (!bfd_elf_add_proc_attr_int (stdoutput, tag, value))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
}
static void
@ -4950,7 +4952,9 @@ arc_set_attribute_string (int tag, const char *value)
if (tag < 1
|| tag >= NUM_KNOWN_OBJ_ATTRIBUTES
|| !attributes_set_explicitly[tag])
bfd_elf_add_proc_attr_string (stdoutput, tag, value);
if (!bfd_elf_add_proc_attr_string (stdoutput, tag, value))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
}
/* Allocate and concatenate two strings. s1 can be NULL but not
@ -5020,7 +5024,9 @@ arc_set_public_attributes (void)
&& (base != bfd_elf_get_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_ARC_CPU_base)))
as_warn (_("Overwrite explicitly set Tag_ARC_CPU_base"));
bfd_elf_add_proc_attr_int (stdoutput, Tag_ARC_CPU_base, base);
if (!bfd_elf_add_proc_attr_int (stdoutput, Tag_ARC_CPU_base, base))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
/* Tag_ARC_ABI_osver. */
if (attributes_set_explicitly[Tag_ARC_ABI_osver])
@ -5069,7 +5075,9 @@ arc_set_public_attributes (void)
{
as_warn (_("Overwrite explicitly set Tag_ARC_ABI_rf16 to full "
"register file"));
bfd_elf_add_proc_attr_int (stdoutput, Tag_ARC_ABI_rf16, 0);
if (!bfd_elf_add_proc_attr_int (stdoutput, Tag_ARC_ABI_rf16, 0))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
}
}

View file

@ -32984,7 +32984,9 @@ aeabi_set_attribute_int (int tag, int value)
if (tag < 1
|| tag >= NUM_KNOWN_OBJ_ATTRIBUTES
|| !attributes_set_explicitly[tag])
bfd_elf_add_proc_attr_int (stdoutput, tag, value);
if (!bfd_elf_add_proc_attr_int (stdoutput, tag, value))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
}
static void
@ -32993,7 +32995,9 @@ aeabi_set_attribute_string (int tag, const char *value)
if (tag < 1
|| tag >= NUM_KNOWN_OBJ_ATTRIBUTES
|| !attributes_set_explicitly[tag])
bfd_elf_add_proc_attr_string (stdoutput, tag, value);
if (!bfd_elf_add_proc_attr_string (stdoutput, tag, value))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
}
/* Return whether features in the *NEEDED feature set are available via

View file

@ -1541,79 +1541,95 @@ md_show_usage (FILE *fp)
-mvdsp enable vector DSP instructions\n"));
}
static void set_csky_attribute (void)
static bool
set_csky_attribute (void)
{
if (mach_flag & CSKY_ARCH_DSP)
{
if (dsp_flag & CSKY_DSP_FLAG_V2)
{
/* Set DSPV2. */
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_DSP_VERSION,
VAL_CSKY_DSP_VERSION_2);
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_DSP_VERSION,
VAL_CSKY_DSP_VERSION_2))
return false;
}
else if (isa_flag & CSKY_ISA_DSP)
{
/* Set DSP extension. */
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_DSP_VERSION,
VAL_CSKY_DSP_VERSION_EXTENSION);
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_DSP_VERSION,
VAL_CSKY_DSP_VERSION_EXTENSION))
return false;
}
/* Set VDSP attribute. */
if (isa_flag & CSKY_ISA_VDSP)
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_VDSP_VERSION,
VAL_CSKY_VDSP_VERSION_1);
{
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_VDSP_VERSION,
VAL_CSKY_VDSP_VERSION_1))
return false;
}
else if (isa_flag & CSKY_ISA_VDSP_2)
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_VDSP_VERSION,
VAL_CSKY_VDSP_VERSION_2);
{
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_VDSP_VERSION,
VAL_CSKY_VDSP_VERSION_2))
return false;
}
}
if (mach_flag & CSKY_ARCH_FLOAT)
{
unsigned int val = VAL_CSKY_FPU_HARDFP_SINGLE;
if (IS_CSKY_ARCH_V1 (mach_flag)) {
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_VERSION,
VAL_CSKY_FPU_VERSION_1);
}
if (IS_CSKY_ARCH_V1 (mach_flag))
{
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_VERSION,
VAL_CSKY_FPU_VERSION_1))
return false;
}
else
{
if (isa_flag & CSKY_ISA_FLOAT_3E4)
{
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_VERSION,
VAL_CSKY_FPU_VERSION_2);
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_VERSION,
VAL_CSKY_FPU_VERSION_2))
return false;
val |= VAL_CSKY_FPU_HARDFP_DOUBLE;
}
else
{
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_VERSION,
VAL_CSKY_FPU_VERSION_2);
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_VERSION,
VAL_CSKY_FPU_VERSION_2))
return false;
}
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_HARDFP,
val);
bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_NUMBER_MODULE,
"IEEE 754");
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_ABI,
float_abi);
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_HARDFP, val))
return false;
if (!bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_NUMBER_MODULE,
"IEEE 754"))
return false;
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_FPU_ABI,
float_abi))
return false;
}
}
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_ISA_FLAGS, isa_flag))
return false;
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_ISA_FLAGS, isa_flag);
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_ISA_EXT_FLAGS, (isa_flag >> 32)))
return false;
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_ISA_EXT_FLAGS, (isa_flag >> 32));
return true;
}
/* Target-specific initialization and option handling. */
@ -1676,8 +1692,10 @@ md_begin (void)
for (p_arch = csky_archs; p_arch->arch_flag != 0; p_arch++)
if ((mach_flag & CSKY_ARCH_MASK) == (p_arch->arch_flag & CSKY_ARCH_MASK))
{
bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_ARCH_NAME, p_arch->name);
if (!bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_ARCH_NAME, p_arch->name))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
bfd_mach_flag = p_arch->bfd_mach_flag;
break;
}
@ -1686,8 +1704,10 @@ md_begin (void)
for (p_cpu = csky_cpus; p_cpu->arch_flag != 0; p_cpu++)
if ((mach_flag & CPU_ARCH_MASK) == p_cpu->arch_flag)
{
bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_CPU_NAME, p_cpu->name);
if (!bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC,
Tag_CSKY_CPU_NAME, p_cpu->name))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
isa_flag |= p_cpu->isa_flag;
break;
}
@ -1856,7 +1876,9 @@ md_begin (void)
/* Set bfd_mach to bfd backend data. */
bfd_set_arch_mach (stdoutput, bfd_arch_csky, bfd_mach_flag);
set_csky_attribute ();
if (!set_csky_attribute ())
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
}
/* The C-SKY assembler emits mapping symbols $t and $d to mark the

View file

@ -20626,8 +20626,10 @@ mips_md_finish (void)
}
}
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
Tag_GNU_MIPS_ABI_FP, fpabi);
if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
Tag_GNU_MIPS_ABI_FP, fpabi))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
}
}

View file

@ -5130,24 +5130,27 @@ msp430_md_finish (void)
/* We have already emitted an error if any of the following attributes
disagree with the attributes in the input assembly file. See
msp430_object_attribute. */
bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_ISA,
target_is_430x () ? OFBA_MSPABI_Val_ISA_MSP430X
: OFBA_MSPABI_Val_ISA_MSP430);
bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Code_Model,
large_model ? OFBA_MSPABI_Val_Code_Model_LARGE
: OFBA_MSPABI_Val_Code_Model_SMALL);
bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Data_Model,
large_model ? OFBA_MSPABI_Val_Code_Model_LARGE
: OFBA_MSPABI_Val_Code_Model_SMALL);
if (!bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_ISA,
target_is_430x ()
? OFBA_MSPABI_Val_ISA_MSP430X
: OFBA_MSPABI_Val_ISA_MSP430)
|| !bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Code_Model,
large_model
? OFBA_MSPABI_Val_Code_Model_LARGE
: OFBA_MSPABI_Val_Code_Model_SMALL)
|| !bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Data_Model,
large_model
? OFBA_MSPABI_Val_Code_Model_LARGE
: OFBA_MSPABI_Val_Code_Model_SMALL)
/* The data region GNU attribute is ignored for the small memory model. */
if (large_model)
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
Tag_GNU_MSP430_Data_Region, lower_data_region_only
? Val_GNU_MSP430_Data_Region_Lower
: Val_GNU_MSP430_Data_Region_Any);
|| (large_model
&& !bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
Tag_GNU_MSP430_Data_Region,
lower_data_region_only
? Val_GNU_MSP430_Data_Region_Lower
: Val_GNU_MSP430_Data_Region_Any)))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
}
/* Returns FALSE if there is a msp430 specific reason why the

View file

@ -4902,7 +4902,9 @@ riscv_write_out_attrs (void)
/* Re-write architecture elf attribute. */
arch_str = riscv_rps_as.subset_list->arch_str;
bfd_elf_add_proc_attr_string (stdoutput, Tag_RISCV_arch, arch_str);
if (!bfd_elf_add_proc_attr_string (stdoutput, Tag_RISCV_arch, arch_str))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
/* For the file without any instruction, we don't set the default_priv_spec
according to the privileged elf attributes since the md_assemble isn't
@ -4937,9 +4939,14 @@ riscv_write_out_attrs (void)
versions[i] = number;
/* Re-write privileged elf attributes. */
bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec, versions[0]);
bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec_minor, versions[1]);
bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec_revision, versions[2]);
if (!bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec,
versions[0])
|| !bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec_minor,
versions[1])
|| !bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec_revision,
versions[2]))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
}
/* Add the default contents for the .riscv.attributes section. */

View file

@ -1125,10 +1125,14 @@ sparc_md_finish (void)
hwcaps = hwcap_seen & U0xffffffff;
hwcaps2 = hwcap_seen >> 32;
if (hwcaps)
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, Tag_GNU_Sparc_HWCAPS, hwcaps);
if (hwcaps2)
bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, Tag_GNU_Sparc_HWCAPS2, hwcaps2);
if ((hwcaps
&& !bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
Tag_GNU_Sparc_HWCAPS, hwcaps))
|| (hwcaps2
&& !bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
Tag_GNU_Sparc_HWCAPS2, hwcaps2)))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
#endif
}

View file

@ -4381,7 +4381,9 @@ tic6x_set_attribute_int (int tag, int value)
|| tag >= NUM_KNOWN_OBJ_ATTRIBUTES)
abort ();
if (!tic6x_attributes_set_explicitly[tag])
bfd_elf_add_proc_attr_int (stdoutput, tag, value);
if (!bfd_elf_add_proc_attr_int (stdoutput, tag, value))
as_fatal (_("error adding attribute: %s"),
bfd_errmsg (bfd_get_error ()));
}
/* Set object attributes deduced from the input file and command line