1 /* Copyright (C) 2008 Jeffrey Brian Arnold <jbarnold@mit.edu>
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License, version 2.
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
11 * You should have received a copy of the GNU General Public License
12 * along with this program; if not, write to the Free Software
13 * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
17 #include "objcommon.h"
19 long get_syms(bfd
*abfd
, asymbol
***syms_ptr
)
21 long storage_needed
= bfd_get_symtab_upper_bound(abfd
);
22 if (storage_needed
== 0)
24 assert(storage_needed
>= 0);
26 *syms_ptr
= (asymbol
**)malloc(storage_needed
);
27 long num_syms
= bfd_canonicalize_symtab(abfd
, *syms_ptr
);
28 assert(num_syms
>= 0);
33 struct supersect
*fetch_supersect(bfd
*abfd
, asection
*sect
, asymbol
**sympp
)
35 static struct supersect
*supersects
= NULL
;
38 for (ss
= supersects
; ss
!= NULL
; ss
= ss
->next
) {
39 if (strcmp(sect
->name
, ss
->name
) == 0 && ss
->parent
== abfd
)
43 struct supersect
*new = malloc(sizeof(*new));
45 new->name
= malloc(strlen(sect
->name
) + 1);
46 strcpy(new->name
, sect
->name
);
47 new->next
= supersects
;
50 new->contents_size
= bfd_get_section_size(sect
);
51 new->contents
= (void *)malloc(align(new->contents_size
, 4));
52 assert(bfd_get_section_contents
53 (abfd
, sect
, new->contents
, 0, new->contents_size
));
55 int relsize
= bfd_get_reloc_upper_bound(abfd
, sect
);
56 new->relocs
= (void *)malloc(relsize
);
58 bfd_canonicalize_reloc(abfd
, sect
, new->relocs
, sympp
);
59 assert(new->num_relocs
>= 0);
64 int label_offset(const char *sym_name
)
68 sym_name
[i
] != 0 && sym_name
[i
+ 1] != 0 && sym_name
[i
+ 2] != 0
69 && sym_name
[i
+ 3] != 0; i
++) {
70 if (sym_name
[i
] == '_' && sym_name
[i
+ 1] == '_'
71 && sym_name
[i
+ 2] == '_' && sym_name
[i
+ 3] == '_')
77 const char *only_label(const char *sym_name
)
79 int offset
= label_offset(sym_name
);
82 return &sym_name
[offset
];
85 const char *dup_wolabel(const char *sym_name
)
87 int offset
, entire_strlen
, label_strlen
, new_strlen
;
90 offset
= label_offset(sym_name
);
94 label_strlen
= strlen(&sym_name
[offset
]) + strlen("____");
96 entire_strlen
= strlen(sym_name
);
97 new_strlen
= entire_strlen
- label_strlen
;
98 newstr
= malloc(new_strlen
+ 1);
99 memcpy(newstr
, sym_name
, new_strlen
);
100 newstr
[new_strlen
] = 0;