1,6 → 1,5 |
/* ELF attributes support (based on ARM EABI attributes). |
Copyright 2005, 2006, 2007, 2009, 2010, 2012 |
Free Software Foundation, Inc. |
Copyright (C) 2005-2015 Free Software Foundation, Inc. |
|
This file is part of BFD, the Binary File Descriptor library. |
|
55,7 → 54,7 |
|
/* Return the size of a single attribute. */ |
static bfd_vma |
obj_attr_size (int tag, obj_attribute *attr) |
obj_attr_size (unsigned int tag, obj_attribute *attr) |
{ |
bfd_vma size; |
|
144,7 → 143,7 |
/* Write attribute ATTR to butter P, and return a pointer to the following |
byte. */ |
static bfd_byte * |
write_obj_attribute (bfd_byte *p, int tag, obj_attribute *attr) |
write_obj_attribute (bfd_byte *p, unsigned int tag, obj_attribute *attr) |
{ |
/* Suppress default entries. */ |
if (is_default_attr (attr)) |
190,7 → 189,7 |
attr = elf_known_obj_attributes (abfd)[vendor]; |
for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++) |
{ |
int tag = i; |
unsigned int tag = i; |
if (get_elf_backend_data (abfd)->obj_attrs_order) |
tag = get_elf_backend_data (abfd)->obj_attrs_order (i); |
p = write_obj_attribute (p, tag, &attr[tag]); |
228,7 → 227,7 |
|
/* Allocate/find an object attribute. */ |
static obj_attribute * |
elf_new_obj_attr (bfd *abfd, int vendor, int tag) |
elf_new_obj_attr (bfd *abfd, int vendor, unsigned int tag) |
{ |
obj_attribute *attr; |
obj_attribute_list *list; |
266,7 → 265,7 |
|
/* Return the value of an integer object attribute. */ |
int |
bfd_elf_get_obj_attr_int (bfd *abfd, int vendor, int tag) |
bfd_elf_get_obj_attr_int (bfd *abfd, int vendor, unsigned int tag) |
{ |
obj_attribute_list *p; |
|
292,7 → 291,7 |
|
/* Add an integer object attribute. */ |
void |
bfd_elf_add_obj_attr_int (bfd *abfd, int vendor, int tag, unsigned int i) |
bfd_elf_add_obj_attr_int (bfd *abfd, int vendor, unsigned int tag, unsigned int i) |
{ |
obj_attribute *attr; |
|
315,7 → 314,7 |
|
/* Add a string object attribute. */ |
void |
bfd_elf_add_obj_attr_string (bfd *abfd, int vendor, int tag, const char *s) |
bfd_elf_add_obj_attr_string (bfd *abfd, int vendor, unsigned int tag, const char *s) |
{ |
obj_attribute *attr; |
|
326,7 → 325,8 |
|
/* Add a int+string object attribute. */ |
void |
bfd_elf_add_obj_attr_int_string (bfd *abfd, int vendor, int tag, |
bfd_elf_add_obj_attr_int_string (bfd *abfd, int vendor, |
unsigned int tag, |
unsigned int i, const char *s) |
{ |
obj_attribute *attr; |
395,7 → 395,7 |
/* Determine whether a GNU object attribute tag takes an integer, a |
string or both. */ |
static int |
gnu_obj_attrs_arg_type (int tag) |
gnu_obj_attrs_arg_type (unsigned int tag) |
{ |
/* Except for Tag_compatibility, for GNU attributes we follow the |
same rule ARM ones > 32 follow: odd-numbered tags take strings |
410,7 → 410,7 |
|
/* Determine what arguments an attribute tag takes. */ |
int |
_bfd_elf_obj_attrs_arg_type (bfd *abfd, int vendor, int tag) |
_bfd_elf_obj_attrs_arg_type (bfd *abfd, int vendor, unsigned int tag) |
{ |
switch (vendor) |
{ |
431,9 → 431,13 |
{ |
bfd_byte *contents; |
bfd_byte *p; |
bfd_byte *p_end; |
bfd_vma len; |
const char *std_sec; |
|
/* PR 17512: file: 2844a11d. */ |
if (hdr->sh_size == 0) |
return; |
contents = (bfd_byte *) bfd_malloc (hdr->sh_size); |
if (!contents) |
return; |
444,23 → 448,31 |
return; |
} |
p = contents; |
p_end = p + hdr->sh_size; |
std_sec = get_elf_backend_data (abfd)->obj_attrs_vendor; |
|
if (*(p++) == 'A') |
{ |
len = hdr->sh_size - 1; |
while (len > 0) |
|
while (len > 0 && p < p_end - 4) |
{ |
int namelen; |
unsigned namelen; |
bfd_vma section_len; |
int vendor; |
|
section_len = bfd_get_32 (abfd, p); |
p += 4; |
if (section_len == 0) |
break; |
if (section_len > len) |
section_len = len; |
len -= section_len; |
namelen = strlen ((char *) p) + 1; |
section_len -= namelen + 4; |
section_len -= 4; |
namelen = strnlen ((char *) p, section_len) + 1; |
if (namelen == 0 || namelen >= section_len) |
break; |
section_len -= namelen; |
if (std_sec && strcmp ((char *) p, std_sec) == 0) |
vendor = OBJ_ATTR_PROC; |
else if (strcmp ((char *) p, "gnu") == 0) |
473,23 → 485,31 |
} |
|
p += namelen; |
while (section_len > 0) |
while (section_len > 0 && p < p_end) |
{ |
int tag; |
unsigned int tag; |
unsigned int n; |
unsigned int val; |
bfd_vma subsection_len; |
bfd_byte *end; |
|
tag = read_unsigned_leb128 (abfd, p, &n); |
tag = safe_read_leb128 (abfd, p, &n, FALSE, p_end); |
p += n; |
if (p < p_end - 4) |
subsection_len = bfd_get_32 (abfd, p); |
else |
subsection_len = 0; |
p += 4; |
if (subsection_len == 0) |
break; |
if (subsection_len > section_len) |
subsection_len = section_len; |
section_len -= subsection_len; |
subsection_len -= n + 4; |
end = p + subsection_len; |
/* PR 17512: file: 0e8c0c90. */ |
if (end > p_end) |
end = p_end; |
switch (tag) |
{ |
case Tag_File: |
497,13 → 517,13 |
{ |
int type; |
|
tag = read_unsigned_leb128 (abfd, p, &n); |
tag = safe_read_leb128 (abfd, p, &n, FALSE, end); |
p += n; |
type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag); |
switch (type & (ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL)) |
{ |
case ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL: |
val = read_unsigned_leb128 (abfd, p, &n); |
val = safe_read_leb128 (abfd, p, &n, FALSE, end); |
p += n; |
bfd_elf_add_obj_attr_int_string (abfd, vendor, tag, |
val, (char *)p); |
515,7 → 535,7 |
p += strlen ((char *)p) + 1; |
break; |
case ATTR_TYPE_FLAG_INT_VAL: |
val = read_unsigned_leb128 (abfd, p, &n); |
val = safe_read_leb128 (abfd, p, &n, FALSE, end); |
p += n; |
bfd_elf_add_obj_attr_int (abfd, vendor, tag, val); |
break; |
647,7 → 667,7 |
for (; in_list || out_list; ) |
{ |
bfd *err_bfd = NULL; |
int err_tag = 0; |
unsigned int err_tag = 0; |
|
/* The tags for each list are in numerical order. */ |
/* If the tags are equal, then merge. */ |