mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-02 23:04:09 +08:00
* config/obj-elf.c (obj_elf_section_type): Add prototype
before obj_elf_section_word and add 'warn' arg. (obj_elf_section_word): Add type pointer arg, and if no #SECTION is matched, try checking for #SECTION_TYPE. (obj_elf_section): Adjust for new args. (obj_elf_type_name): New function. (obj_elf_type): Call it, and accept STT_foo number strings in .type statements as output by SunPRO compiler.
This commit is contained in:
parent
09d71d234a
commit
44bf236263
@ -782,31 +782,7 @@ obj_elf_parse_section_letters (char *str, size_t len)
|
||||
}
|
||||
|
||||
static int
|
||||
obj_elf_section_word (char *str, size_t len)
|
||||
{
|
||||
if (len == 5 && strncmp (str, "write", 5) == 0)
|
||||
return SHF_WRITE;
|
||||
if (len == 5 && strncmp (str, "alloc", 5) == 0)
|
||||
return SHF_ALLOC;
|
||||
if (len == 9 && strncmp (str, "execinstr", 9) == 0)
|
||||
return SHF_EXECINSTR;
|
||||
if (len == 3 && strncmp (str, "tls", 3) == 0)
|
||||
return SHF_TLS;
|
||||
|
||||
#ifdef md_elf_section_word
|
||||
{
|
||||
int md_attr = md_elf_section_word (str, len);
|
||||
if (md_attr >= 0)
|
||||
return md_attr;
|
||||
}
|
||||
#endif
|
||||
|
||||
as_warn (_("unrecognized section attribute"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
obj_elf_section_type (char *str, size_t len)
|
||||
obj_elf_section_type (char *str, size_t len, bfd_boolean warn)
|
||||
{
|
||||
if (len == 8 && strncmp (str, "progbits", 8) == 0)
|
||||
return SHT_PROGBITS;
|
||||
@ -829,10 +805,42 @@ obj_elf_section_type (char *str, size_t len)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (warn)
|
||||
as_warn (_("unrecognized section type"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
obj_elf_section_word (char *str, size_t len, int *type)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (len == 5 && strncmp (str, "write", 5) == 0)
|
||||
return SHF_WRITE;
|
||||
if (len == 5 && strncmp (str, "alloc", 5) == 0)
|
||||
return SHF_ALLOC;
|
||||
if (len == 9 && strncmp (str, "execinstr", 9) == 0)
|
||||
return SHF_EXECINSTR;
|
||||
if (len == 3 && strncmp (str, "tls", 3) == 0)
|
||||
return SHF_TLS;
|
||||
|
||||
#ifdef md_elf_section_word
|
||||
{
|
||||
int md_attr = md_elf_section_word (str, len);
|
||||
if (md_attr >= 0)
|
||||
return md_attr;
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = obj_elf_section_type (str, len, FALSE);
|
||||
if (ret != 0)
|
||||
*type = ret;
|
||||
else
|
||||
as_warn (_("unrecognized section attribute"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Get name of section. */
|
||||
static char *
|
||||
obj_elf_section_name (void)
|
||||
@ -965,14 +973,14 @@ obj_elf_section (int push)
|
||||
ignore_rest_of_line ();
|
||||
return;
|
||||
}
|
||||
type = obj_elf_section_type (beg, strlen (beg));
|
||||
type = obj_elf_section_type (beg, strlen (beg), TRUE);
|
||||
}
|
||||
else if (c == '@' || c == '%')
|
||||
{
|
||||
beg = ++input_line_pointer;
|
||||
c = get_symbol_end ();
|
||||
*input_line_pointer = c;
|
||||
type = obj_elf_section_type (beg, input_line_pointer - beg);
|
||||
type = obj_elf_section_type (beg, input_line_pointer - beg, TRUE);
|
||||
}
|
||||
else
|
||||
input_line_pointer = save;
|
||||
@ -1035,7 +1043,7 @@ obj_elf_section (int push)
|
||||
c = get_symbol_end ();
|
||||
*input_line_pointer = c;
|
||||
|
||||
attr |= obj_elf_section_word (beg, input_line_pointer - beg);
|
||||
attr |= obj_elf_section_word (beg, input_line_pointer - beg, & type);
|
||||
|
||||
SKIP_WHITESPACE ();
|
||||
}
|
||||
@ -1543,7 +1551,7 @@ obj_elf_size (int ignore ATTRIBUTE_UNUSED)
|
||||
}
|
||||
|
||||
/* Handle the ELF .type pseudo-op. This sets the type of a symbol.
|
||||
There are five syntaxes:
|
||||
There are six syntaxes:
|
||||
|
||||
The first (used on Solaris) is
|
||||
.type SYM,#function
|
||||
@ -1555,8 +1563,32 @@ obj_elf_size (int ignore ATTRIBUTE_UNUSED)
|
||||
.type SYM,%function
|
||||
The fifth (used on SVR4/860) is
|
||||
.type SYM,"function"
|
||||
The sixth (emitted by recent SunPRO under Solaris) is
|
||||
.type SYM,[0-9]
|
||||
where the integer is the STT_* value.
|
||||
*/
|
||||
|
||||
static char *
|
||||
obj_elf_type_name (char *cp)
|
||||
{
|
||||
char *p;
|
||||
|
||||
p = input_line_pointer;
|
||||
if (*input_line_pointer >= '0'
|
||||
&& *input_line_pointer <= '9')
|
||||
{
|
||||
while (*input_line_pointer >= '0'
|
||||
&& *input_line_pointer <= '9')
|
||||
++input_line_pointer;
|
||||
*cp = *input_line_pointer;
|
||||
*input_line_pointer = '\0';
|
||||
}
|
||||
else
|
||||
*cp = get_symbol_end ();
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
static void
|
||||
obj_elf_type (int ignore ATTRIBUTE_UNUSED)
|
||||
{
|
||||
@ -1584,23 +1616,27 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSED)
|
||||
|| *input_line_pointer == '%')
|
||||
++input_line_pointer;
|
||||
|
||||
typename = input_line_pointer;
|
||||
c = get_symbol_end ();
|
||||
typename = obj_elf_type_name (& c);
|
||||
|
||||
type = 0;
|
||||
if (strcmp (typename, "function") == 0
|
||||
|| strcmp (typename, "2") == 0
|
||||
|| strcmp (typename, "STT_FUNC") == 0)
|
||||
type = BSF_FUNCTION;
|
||||
else if (strcmp (typename, "object") == 0
|
||||
|| strcmp (typename, "1") == 0
|
||||
|| strcmp (typename, "STT_OBJECT") == 0)
|
||||
type = BSF_OBJECT;
|
||||
else if (strcmp (typename, "tls_object") == 0
|
||||
|| strcmp (typename, "6") == 0
|
||||
|| strcmp (typename, "STT_TLS") == 0)
|
||||
type = BSF_OBJECT | BSF_THREAD_LOCAL;
|
||||
else if (strcmp (typename, "notype") == 0
|
||||
|| strcmp (typename, "0") == 0
|
||||
|| strcmp (typename, "STT_NOTYPE") == 0)
|
||||
;
|
||||
else if (strcmp (typename, "common") == 0
|
||||
|| strcmp (typename, "5") == 0
|
||||
|| strcmp (typename, "STT_COMMON") == 0)
|
||||
{
|
||||
type = BSF_OBJECT;
|
||||
|
@ -9819,7 +9819,7 @@ do_t_mrs (void)
|
||||
{
|
||||
constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1),
|
||||
_("selected processor does not support "
|
||||
"requested special purpose register %x"));
|
||||
"requested special purpose register"));
|
||||
/* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all. */
|
||||
constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
|
||||
_("'CPSR' or 'SPSR' expected"));
|
||||
|
Loading…
Reference in New Issue
Block a user