mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-20 01:50:24 +08:00
Apply patch from Thomas de Lellis to allow nm to distinguish between weak
function symbols and weak data symbols.
This commit is contained in:
@ -1,5 +1,23 @@
|
|||||||
2000-01-27 Thomas de Lellis <tdel@wrs.com>
|
2000-01-27 Thomas de Lellis <tdel@windriver.com>
|
||||||
|
|
||||||
|
* syms.c (bfd_decode_symclass)
|
||||||
|
Two new class characters were added - 'V' and 'v'. The
|
||||||
|
meaning of 'W' is now restricted to just weak non-object
|
||||||
|
symbols. This allows differentiation between, for example,
|
||||||
|
weak functions vs weak objects. nm for example now dumps:
|
||||||
|
'W' = weak global
|
||||||
|
'w' = weak unresolved
|
||||||
|
'V' = weak global object
|
||||||
|
'v' = weak unresolved object
|
||||||
|
|
||||||
|
(bfd_is_undefined_symclass): New function. Return true if the
|
||||||
|
given symbol class represents and undefined/unresolved symbol.
|
||||||
|
|
||||||
|
(bfd_symbol_info): Use bfd_is_undefined_symclass to check for
|
||||||
|
unresolved symbols.
|
||||||
|
|
||||||
|
* bfd-in2.h: Add prototype for bfd_is_undefined_symbol().
|
||||||
|
|
||||||
* elf32-arm.h (elf32_arm_get_symbol_type): If a symbol has the
|
* elf32-arm.h (elf32_arm_get_symbol_type): If a symbol has the
|
||||||
STT_ARM_16BIT flag set, but it is not attached to a data object
|
STT_ARM_16BIT flag set, but it is not attached to a data object
|
||||||
return STT_ARM_16BIT so that it will be treated as code by the
|
return STT_ARM_16BIT so that it will be treated as code by the
|
||||||
|
@ -2433,6 +2433,9 @@ bfd_print_symbol_vandf PARAMS ((PTR file, asymbol *symbol));
|
|||||||
int
|
int
|
||||||
bfd_decode_symclass PARAMS ((asymbol *symbol));
|
bfd_decode_symclass PARAMS ((asymbol *symbol));
|
||||||
|
|
||||||
|
boolean
|
||||||
|
bfd_is_undefined_symclass PARAMS ((int symclass));
|
||||||
|
|
||||||
void
|
void
|
||||||
bfd_symbol_info PARAMS ((asymbol *symbol, symbol_info *ret));
|
bfd_symbol_info PARAMS ((asymbol *symbol, symbol_info *ret));
|
||||||
|
|
||||||
|
46
bfd/syms.c
46
bfd/syms.c
@ -584,14 +584,28 @@ bfd_decode_symclass (symbol)
|
|||||||
if (bfd_is_und_section (symbol->section))
|
if (bfd_is_und_section (symbol->section))
|
||||||
{
|
{
|
||||||
if (symbol->flags & BSF_WEAK)
|
if (symbol->flags & BSF_WEAK)
|
||||||
return 'w';
|
{
|
||||||
|
/* If weak, determine if it's specifically an object
|
||||||
|
or non-object weak. */
|
||||||
|
if (symbol->flags & BSF_OBJECT)
|
||||||
|
return 'v';
|
||||||
|
else
|
||||||
|
return 'w';
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return 'U';
|
return 'U';
|
||||||
}
|
}
|
||||||
if (bfd_is_ind_section (symbol->section))
|
if (bfd_is_ind_section (symbol->section))
|
||||||
return 'I';
|
return 'I';
|
||||||
if (symbol->flags & BSF_WEAK)
|
if (symbol->flags & BSF_WEAK)
|
||||||
return 'W';
|
{
|
||||||
|
/* If weak, determine if it's specifically an object
|
||||||
|
or non-object weak. */
|
||||||
|
if (symbol->flags & BSF_OBJECT)
|
||||||
|
return 'V';
|
||||||
|
else
|
||||||
|
return 'W';
|
||||||
|
}
|
||||||
if (!(symbol->flags & (BSF_GLOBAL | BSF_LOCAL)))
|
if (!(symbol->flags & (BSF_GLOBAL | BSF_LOCAL)))
|
||||||
return '?';
|
return '?';
|
||||||
|
|
||||||
@ -615,6 +629,26 @@ bfd_decode_symclass (symbol)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
FUNCTION
|
||||||
|
bfd_is_undefined_symclass
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Returns non-zero if the class symbol returned by
|
||||||
|
bfd_decode_symclass represents an undefined symbol.
|
||||||
|
Returns zero otherwise.
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
boolean bfd_is_undefined_symclass (int symclass);
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean
|
||||||
|
bfd_is_undefined_symclass (symclass)
|
||||||
|
int symclass;
|
||||||
|
{
|
||||||
|
return symclass == 'U' || symclass == 'w' || symclass == 'v';
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
FUNCTION
|
FUNCTION
|
||||||
bfd_symbol_info
|
bfd_symbol_info
|
||||||
@ -634,10 +668,12 @@ bfd_symbol_info (symbol, ret)
|
|||||||
symbol_info *ret;
|
symbol_info *ret;
|
||||||
{
|
{
|
||||||
ret->type = bfd_decode_symclass (symbol);
|
ret->type = bfd_decode_symclass (symbol);
|
||||||
if (ret->type != 'U' && ret->type != 'w')
|
|
||||||
ret->value = symbol->value + symbol->section->vma;
|
if (bfd_is_undefined_symclass (ret->type))
|
||||||
else
|
|
||||||
ret->value = 0;
|
ret->value = 0;
|
||||||
|
else
|
||||||
|
ret->value = symbol->value + symbol->section->vma;
|
||||||
|
|
||||||
ret->name = symbol->name;
|
ret->name = symbol->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
2000-27-01 Thomas de Lellis <tdel@windriver.com>
|
||||||
|
|
||||||
|
* nm.c (print_symbol_info_bsd): Use bfd_is_undefined_symclass to
|
||||||
|
check to unresolved symbols.
|
||||||
|
(print_symbol_info_sysv): Ditto.
|
||||||
|
(print_symbol_info_posix): Ditto.
|
||||||
|
|
||||||
|
* binutils.texi: Document new 'V' symclass flag for nm.
|
||||||
|
|
||||||
2000-01-27 Nick Clifton <nickc@redhat.com>
|
2000-01-27 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
* binutils.texi (objdump): Document new ARM specific
|
* binutils.texi (objdump): Document new ARM specific
|
||||||
|
@ -700,11 +700,18 @@ The symbol is in the text (code) section.
|
|||||||
@item U
|
@item U
|
||||||
The symbol is undefined.
|
The symbol is undefined.
|
||||||
|
|
||||||
|
@item V
|
||||||
|
The symbol is a weak object. When a weak defined symbol is linked with
|
||||||
|
a normal defined symbol, the normal defined symbol is used with no error.
|
||||||
|
When a weak undefined symbol is linked and the symbol is not defined,
|
||||||
|
the value of the weak symbol becomes zero with no error.
|
||||||
|
|
||||||
@item W
|
@item W
|
||||||
The symbol is weak. When a weak defined symbol is linked with a normal
|
The symbol is a weak symbol that has not been specifically tagged as a
|
||||||
defined symbol, the normal defined symbol is used with no error. When a
|
weak object symbol. When a weak defined symbol is linked with a normal
|
||||||
weak undefined symbol is linked and the symbol is not defined, the value
|
defined symbol, the normal defined symbol is used with no error.
|
||||||
of the weak symbol becomes zero with no error.
|
When a weak undefined symbol is linked and the symbol is not defined,
|
||||||
|
the value of the weak symbol becomes zero with no error.
|
||||||
|
|
||||||
@item -
|
@item -
|
||||||
The symbol is a stabs symbol in an a.out object file. In this case, the
|
The symbol is a stabs symbol in an a.out object file. In this case, the
|
||||||
|
@ -1427,7 +1427,7 @@ print_symbol_info_bsd (info, abfd)
|
|||||||
symbol_info *info;
|
symbol_info *info;
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
if (info->type == 'U' || info->type == 'w')
|
if (bfd_is_undefined_symclass (info->type))
|
||||||
{
|
{
|
||||||
printf ("%*s",
|
printf ("%*s",
|
||||||
#ifdef BFD64
|
#ifdef BFD64
|
||||||
@ -1458,7 +1458,7 @@ print_symbol_info_sysv (info, abfd)
|
|||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
print_symname ("%-20s|", info->name, abfd); /* Name */
|
print_symname ("%-20s|", info->name, abfd); /* Name */
|
||||||
if (info->type == 'U' || info->type == 'w')
|
if (bfd_is_undefined_symclass (info->type))
|
||||||
printf (" "); /* Value */
|
printf (" "); /* Value */
|
||||||
else
|
else
|
||||||
print_value (info->value);
|
print_value (info->value);
|
||||||
@ -1481,7 +1481,7 @@ print_symbol_info_posix (info, abfd)
|
|||||||
{
|
{
|
||||||
print_symname ("%s ", info->name, abfd);
|
print_symname ("%s ", info->name, abfd);
|
||||||
printf ("%c ", info->type);
|
printf ("%c ", info->type);
|
||||||
if (info->type == 'U' || info->type == 'w')
|
if (bfd_is_undefined_symclass (info->type))
|
||||||
printf (" ");
|
printf (" ");
|
||||||
else
|
else
|
||||||
print_value (info->value);
|
print_value (info->value);
|
||||||
|
Reference in New Issue
Block a user