2011-08-08 Tristan Gingold <gingold@adacore.com>
* mach-o.c (bfd_mach_o_normalize_section_name): New function. (bfd_mach_o_convert_section_name_to_bfd): Use it. (bfd_mach_o_get_section_type_from_name): New function. (bfd_mach_o_get_section_attribute_from_name): Ditto. * mach-o.h (bfd_mach_o_section): Move bfdsection field at the end. Add comments. Add prototypes for the above new functions.
This commit is contained in:
parent
066a66625f
commit
53d58d96a7
3 changed files with 70 additions and 18 deletions
|
@ -1,3 +1,12 @@
|
|||
2011-08-08 Tristan Gingold <gingold@adacore.com>
|
||||
|
||||
* mach-o.c (bfd_mach_o_normalize_section_name): New function.
|
||||
(bfd_mach_o_convert_section_name_to_bfd): Use it.
|
||||
(bfd_mach_o_get_section_type_from_name): New function.
|
||||
(bfd_mach_o_get_section_attribute_from_name): Ditto.
|
||||
* mach-o.h (bfd_mach_o_section): Move bfdsection field at the end.
|
||||
Add comments. Add prototypes for the above new functions.
|
||||
|
||||
2011-08-05 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* netbsd-core.c (netbsd_core_vec): Init match_priority field.
|
||||
|
|
69
bfd/mach-o.c
69
bfd/mach-o.c
|
@ -144,44 +144,52 @@ static const struct mach_o_segment_name_xlat segsec_names_xlat[] =
|
|||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
||||
/* Mach-O to bfd names. */
|
||||
|
||||
static void
|
||||
bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, bfd_mach_o_section *section,
|
||||
char **name, flagword *flags)
|
||||
void
|
||||
bfd_mach_o_normalize_section_name (const char *segname, const char *sectname,
|
||||
const char **name, flagword *flags)
|
||||
{
|
||||
const struct mach_o_segment_name_xlat *seg;
|
||||
char *res;
|
||||
unsigned int len;
|
||||
const char *pfx = "";
|
||||
|
||||
*name = NULL;
|
||||
*flags = SEC_NO_FLAGS;
|
||||
|
||||
for (seg = segsec_names_xlat; seg->segname; seg++)
|
||||
{
|
||||
if (strcmp (seg->segname, section->segname) == 0)
|
||||
if (strcmp (seg->segname, segname) == 0)
|
||||
{
|
||||
const struct mach_o_section_name_xlat *sec;
|
||||
|
||||
for (sec = seg->sections; sec->mach_o_name; sec++)
|
||||
{
|
||||
if (strcmp (sec->mach_o_name, section->sectname) == 0)
|
||||
if (strcmp (sec->mach_o_name, sectname) == 0)
|
||||
{
|
||||
len = strlen (sec->bfd_name);
|
||||
res = bfd_alloc (abfd, len + 1);
|
||||
|
||||
if (res == NULL)
|
||||
return;
|
||||
strcpy (res, sec->bfd_name);
|
||||
*name = res;
|
||||
*name = sec->bfd_name;
|
||||
*flags = sec->flags;
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, bfd_mach_o_section *section,
|
||||
const char **name, flagword *flags)
|
||||
{
|
||||
char *res;
|
||||
unsigned int len;
|
||||
const char *pfx = "";
|
||||
|
||||
/* First search for a canonical name. */
|
||||
bfd_mach_o_normalize_section_name (section->segname, section->sectname,
|
||||
name, flags);
|
||||
|
||||
/* Return now if found. */
|
||||
if (*name)
|
||||
return;
|
||||
|
||||
len = strlen (section->segname) + 1
|
||||
+ strlen (section->sectname) + 1;
|
||||
|
@ -201,6 +209,7 @@ bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, bfd_mach_o_section *section,
|
|||
return;
|
||||
snprintf (res, len, "%s%s.%s", pfx, section->segname, section->sectname);
|
||||
*name = res;
|
||||
*flags = SEC_NO_FLAGS;
|
||||
}
|
||||
|
||||
/* Convert a bfd section name to a Mach-O segment + section name. */
|
||||
|
@ -1496,7 +1505,7 @@ bfd_mach_o_make_bfd_section (bfd *abfd, bfd_mach_o_section *section,
|
|||
unsigned long prot)
|
||||
{
|
||||
asection *bfdsec;
|
||||
char *sname;
|
||||
const char *sname;
|
||||
flagword flags;
|
||||
|
||||
bfd_mach_o_convert_section_name_to_bfd (abfd, section, &sname, &flags);
|
||||
|
@ -3404,6 +3413,32 @@ static bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
|
|||
{ NULL, 0}
|
||||
};
|
||||
|
||||
/* Get the section type from NAME. Return -1 if NAME is unknown. */
|
||||
|
||||
unsigned int
|
||||
bfd_mach_o_get_section_type_from_name (const char *name)
|
||||
{
|
||||
bfd_mach_o_xlat_name *x;
|
||||
|
||||
for (x = bfd_mach_o_section_type_name; x->name; x++)
|
||||
if (strcmp (x->name, name) == 0)
|
||||
return x->val;
|
||||
return (unsigned int)-1;
|
||||
}
|
||||
|
||||
/* Get the section attribute from NAME. Return -1 if NAME is unknown. */
|
||||
|
||||
unsigned int
|
||||
bfd_mach_o_get_section_attribute_from_name (const char *name)
|
||||
{
|
||||
bfd_mach_o_xlat_name *x;
|
||||
|
||||
for (x = bfd_mach_o_section_attribute_name; x->name; x++)
|
||||
if (strcmp (x->name, name) == 0)
|
||||
return x->val;
|
||||
return (unsigned int)-1;
|
||||
}
|
||||
|
||||
static void
|
||||
bfd_mach_o_print_private_header (bfd *abfd, FILE *file)
|
||||
{
|
||||
|
|
10
bfd/mach-o.h
10
bfd/mach-o.h
|
@ -46,7 +46,7 @@ bfd_mach_o_header;
|
|||
|
||||
typedef struct bfd_mach_o_section
|
||||
{
|
||||
asection *bfdsection;
|
||||
/* Fields present in the file. */
|
||||
char sectname[16 + 1];
|
||||
char segname[16 + 1];
|
||||
bfd_vma addr;
|
||||
|
@ -59,6 +59,9 @@ typedef struct bfd_mach_o_section
|
|||
unsigned long reserved1;
|
||||
unsigned long reserved2;
|
||||
unsigned long reserved3;
|
||||
|
||||
/* Corresponding bfd section. */
|
||||
asection *bfdsection;
|
||||
}
|
||||
bfd_mach_o_section;
|
||||
#define BFD_MACH_O_SECTION_SIZE 68
|
||||
|
@ -610,6 +613,11 @@ bfd_boolean bfd_mach_o_set_section_contents (bfd *, asection *, const void *,
|
|||
file_ptr, bfd_size_type);
|
||||
unsigned int bfd_mach_o_version (bfd *);
|
||||
|
||||
unsigned int bfd_mach_o_get_section_type_from_name (const char *);
|
||||
unsigned int bfd_mach_o_get_section_attribute_from_name (const char *);
|
||||
void bfd_mach_o_normalize_section_name (const char *, const char *,
|
||||
const char **, flagword *);
|
||||
|
||||
extern const bfd_target mach_o_fat_vec;
|
||||
|
||||
#endif /* _BFD_MACH_O_H_ */
|
||||
|
|
Loading…
Reference in a new issue