xsym.c 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339
  1. /* xSYM symbol-file support for BFD.
  2. Copyright (C) 1999-2022 Free Software Foundation, Inc.
  3. This file is part of BFD, the Binary File Descriptor library.
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  15. MA 02110-1301, USA. */
  16. /* xSYM is the debugging format used by CodeWarrior on Mac OS classic. */
  17. #include "sysdep.h"
  18. #include "xsym.h"
  19. #include "bfd.h"
  20. #include "libbfd.h"
  21. #define bfd_sym_close_and_cleanup _bfd_generic_close_and_cleanup
  22. #define bfd_sym_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
  23. #define bfd_sym_new_section_hook _bfd_generic_new_section_hook
  24. #define bfd_sym_bfd_is_local_label_name bfd_generic_is_local_label_name
  25. #define bfd_sym_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
  26. #define bfd_sym_get_lineno _bfd_nosymbols_get_lineno
  27. #define bfd_sym_find_nearest_line _bfd_nosymbols_find_nearest_line
  28. #define bfd_sym_find_line _bfd_nosymbols_find_line
  29. #define bfd_sym_find_inliner_info _bfd_nosymbols_find_inliner_info
  30. #define bfd_sym_get_symbol_version_string _bfd_nosymbols_get_symbol_version_string
  31. #define bfd_sym_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
  32. #define bfd_sym_read_minisymbols _bfd_generic_read_minisymbols
  33. #define bfd_sym_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
  34. #define bfd_sym_set_arch_mach _bfd_generic_set_arch_mach
  35. #define bfd_sym_get_section_contents _bfd_generic_get_section_contents
  36. #define bfd_sym_set_section_contents _bfd_generic_set_section_contents
  37. #define bfd_sym_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
  38. #define bfd_sym_bfd_relax_section bfd_generic_relax_section
  39. #define bfd_sym_bfd_gc_sections bfd_generic_gc_sections
  40. #define bfd_sym_bfd_lookup_section_flags bfd_generic_lookup_section_flags
  41. #define bfd_sym_bfd_merge_sections bfd_generic_merge_sections
  42. #define bfd_sym_bfd_is_group_section bfd_generic_is_group_section
  43. #define bfd_sym_bfd_group_name bfd_generic_group_name
  44. #define bfd_sym_bfd_discard_group bfd_generic_discard_group
  45. #define bfd_sym_section_already_linked _bfd_generic_section_already_linked
  46. #define bfd_sym_bfd_define_common_symbol bfd_generic_define_common_symbol
  47. #define bfd_sym_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
  48. #define bfd_sym_bfd_define_start_stop bfd_generic_define_start_stop
  49. #define bfd_sym_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
  50. #define bfd_sym_bfd_link_add_symbols _bfd_generic_link_add_symbols
  51. #define bfd_sym_bfd_link_just_syms _bfd_generic_link_just_syms
  52. #define bfd_sym_bfd_copy_link_hash_symbol_type \
  53. _bfd_generic_copy_link_hash_symbol_type
  54. #define bfd_sym_bfd_final_link _bfd_generic_final_link
  55. #define bfd_sym_bfd_link_split_section _bfd_generic_link_split_section
  56. #define bfd_sym_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
  57. #define bfd_sym_bfd_link_check_relocs _bfd_generic_link_check_relocs
  58. extern const bfd_target sym_vec;
  59. static int
  60. pstrcmp (const char *as, const char *bs)
  61. {
  62. const unsigned char *a = (const unsigned char *) as;
  63. const unsigned char *b = (const unsigned char *) bs;
  64. unsigned char clen;
  65. int ret;
  66. clen = (a[0] > b[0]) ? b[0] : a[0];
  67. ret = memcmp (a + 1, b + 1, clen);
  68. if (ret != 0)
  69. return ret;
  70. if (a[0] == b[0])
  71. return 0;
  72. else if (a[0] < b[0])
  73. return -1;
  74. else
  75. return 1;
  76. }
  77. static unsigned long
  78. compute_offset (unsigned long first_page,
  79. unsigned long page_size,
  80. unsigned long entry_size,
  81. unsigned long sym_index)
  82. {
  83. unsigned long entries_per_page = page_size / entry_size;
  84. unsigned long page_number = first_page + (sym_index / entries_per_page);
  85. unsigned long page_offset = (sym_index % entries_per_page) * entry_size;
  86. return (page_number * page_size) + page_offset;
  87. }
  88. bool
  89. bfd_sym_mkobject (bfd *abfd ATTRIBUTE_UNUSED)
  90. {
  91. return 1;
  92. }
  93. void
  94. bfd_sym_print_symbol (bfd *abfd ATTRIBUTE_UNUSED,
  95. void * afile ATTRIBUTE_UNUSED,
  96. asymbol *symbol ATTRIBUTE_UNUSED,
  97. bfd_print_symbol_type how ATTRIBUTE_UNUSED)
  98. {
  99. return;
  100. }
  101. bool
  102. bfd_sym_valid (bfd *abfd)
  103. {
  104. if (abfd == NULL || abfd->xvec == NULL)
  105. return 0;
  106. return abfd->xvec == &sym_vec;
  107. }
  108. unsigned char *
  109. bfd_sym_read_name_table (bfd *abfd, bfd_sym_header_block *dshb)
  110. {
  111. size_t table_size = dshb->dshb_nte.dti_page_count * dshb->dshb_page_size;
  112. size_t table_offset = dshb->dshb_nte.dti_first_page * dshb->dshb_page_size;
  113. if (bfd_seek (abfd, table_offset, SEEK_SET) != 0)
  114. return false;
  115. return _bfd_alloc_and_read (abfd, table_size, table_size);
  116. }
  117. void
  118. bfd_sym_parse_file_reference_v32 (unsigned char *buf,
  119. size_t len,
  120. bfd_sym_file_reference *entry)
  121. {
  122. BFD_ASSERT (len == 6);
  123. entry->fref_frte_index = bfd_getb16 (buf);
  124. entry->fref_offset = bfd_getb32 (buf + 2);
  125. }
  126. void
  127. bfd_sym_parse_disk_table_v32 (unsigned char *buf,
  128. size_t len,
  129. bfd_sym_table_info *table)
  130. {
  131. BFD_ASSERT (len == 8);
  132. table->dti_first_page = bfd_getb16 (buf);
  133. table->dti_page_count = bfd_getb16 (buf + 2);
  134. table->dti_object_count = bfd_getb32 (buf + 4);
  135. }
  136. void
  137. bfd_sym_parse_header_v32 (unsigned char *buf,
  138. size_t len,
  139. bfd_sym_header_block *header)
  140. {
  141. BFD_ASSERT (len == 154);
  142. memcpy (header->dshb_id, buf, 32);
  143. header->dshb_page_size = bfd_getb16 (buf + 32);
  144. header->dshb_hash_page = bfd_getb16 (buf + 34);
  145. header->dshb_root_mte = bfd_getb16 (buf + 36);
  146. header->dshb_mod_date = bfd_getb32 (buf + 38);
  147. bfd_sym_parse_disk_table_v32 (buf + 42, 8, &header->dshb_frte);
  148. bfd_sym_parse_disk_table_v32 (buf + 50, 8, &header->dshb_rte);
  149. bfd_sym_parse_disk_table_v32 (buf + 58, 8, &header->dshb_mte);
  150. bfd_sym_parse_disk_table_v32 (buf + 66, 8, &header->dshb_cmte);
  151. bfd_sym_parse_disk_table_v32 (buf + 74, 8, &header->dshb_cvte);
  152. bfd_sym_parse_disk_table_v32 (buf + 82, 8, &header->dshb_csnte);
  153. bfd_sym_parse_disk_table_v32 (buf + 90, 8, &header->dshb_clte);
  154. bfd_sym_parse_disk_table_v32 (buf + 98, 8, &header->dshb_ctte);
  155. bfd_sym_parse_disk_table_v32 (buf + 106, 8, &header->dshb_tte);
  156. bfd_sym_parse_disk_table_v32 (buf + 114, 8, &header->dshb_nte);
  157. bfd_sym_parse_disk_table_v32 (buf + 122, 8, &header->dshb_tinfo);
  158. bfd_sym_parse_disk_table_v32 (buf + 130, 8, &header->dshb_fite);
  159. bfd_sym_parse_disk_table_v32 (buf + 138, 8, &header->dshb_const);
  160. memcpy (&header->dshb_file_creator, buf + 146, 4);
  161. memcpy (&header->dshb_file_type, buf + 150, 4);
  162. }
  163. int
  164. bfd_sym_read_header_v32 (bfd *abfd, bfd_sym_header_block *header)
  165. {
  166. unsigned char buf[154];
  167. long ret;
  168. ret = bfd_bread (buf, 154, abfd);
  169. if (ret != 154)
  170. return -1;
  171. bfd_sym_parse_header_v32 (buf, 154, header);
  172. return 0;
  173. }
  174. int
  175. bfd_sym_read_header_v34 (bfd *abfd ATTRIBUTE_UNUSED,
  176. bfd_sym_header_block *header ATTRIBUTE_UNUSED)
  177. {
  178. abort ();
  179. }
  180. int
  181. bfd_sym_read_header (bfd *abfd,
  182. bfd_sym_header_block *header,
  183. bfd_sym_version version)
  184. {
  185. switch (version)
  186. {
  187. case BFD_SYM_VERSION_3_5:
  188. case BFD_SYM_VERSION_3_4:
  189. return bfd_sym_read_header_v34 (abfd, header);
  190. case BFD_SYM_VERSION_3_3:
  191. case BFD_SYM_VERSION_3_2:
  192. return bfd_sym_read_header_v32 (abfd, header);
  193. case BFD_SYM_VERSION_3_1:
  194. default:
  195. return 0;
  196. }
  197. }
  198. int
  199. bfd_sym_read_version (bfd *abfd, bfd_sym_version *version)
  200. {
  201. char version_string[32];
  202. long ret;
  203. ret = bfd_bread (version_string, sizeof (version_string), abfd);
  204. if (ret != sizeof (version_string))
  205. return -1;
  206. if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_1) == 0)
  207. *version = BFD_SYM_VERSION_3_1;
  208. else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_2) == 0)
  209. *version = BFD_SYM_VERSION_3_2;
  210. else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_3) == 0)
  211. *version = BFD_SYM_VERSION_3_3;
  212. else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_4) == 0)
  213. *version = BFD_SYM_VERSION_3_4;
  214. else if (pstrcmp (version_string, BFD_SYM_VERSION_STR_3_5) == 0)
  215. *version = BFD_SYM_VERSION_3_5;
  216. else
  217. return -1;
  218. return 0;
  219. }
  220. void
  221. bfd_sym_display_table_summary (FILE *f,
  222. bfd_sym_table_info *dti,
  223. const char *name)
  224. {
  225. fprintf (f, "%-6s %13ld %13ld %13ld\n",
  226. name,
  227. dti->dti_first_page,
  228. dti->dti_page_count,
  229. dti->dti_object_count);
  230. }
  231. void
  232. bfd_sym_display_header (FILE *f, bfd_sym_header_block *dshb)
  233. {
  234. fprintf (f, " Version: %.*s\n", dshb->dshb_id[0], dshb->dshb_id + 1);
  235. fprintf (f, " Page Size: 0x%x\n", dshb->dshb_page_size);
  236. fprintf (f, " Hash Page: %lu\n", dshb->dshb_hash_page);
  237. fprintf (f, " Root MTE: %lu\n", dshb->dshb_root_mte);
  238. fprintf (f, " Modification Date: ");
  239. fprintf (f, "[unimplemented]");
  240. fprintf (f, " (0x%lx)\n", dshb->dshb_mod_date);
  241. fprintf (f, " File Creator: %.4s Type: %.4s\n\n",
  242. dshb->dshb_file_creator, dshb->dshb_file_type);
  243. fprintf (f, "Table Name First Page Page Count Object Count\n");
  244. fprintf (f, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  245. bfd_sym_display_table_summary (f, &dshb->dshb_nte, "NTE");
  246. bfd_sym_display_table_summary (f, &dshb->dshb_rte, "RTE");
  247. bfd_sym_display_table_summary (f, &dshb->dshb_mte, "MTE");
  248. bfd_sym_display_table_summary (f, &dshb->dshb_frte, "FRTE");
  249. bfd_sym_display_table_summary (f, &dshb->dshb_cmte, "CMTE");
  250. bfd_sym_display_table_summary (f, &dshb->dshb_cvte, "CVTE");
  251. bfd_sym_display_table_summary (f, &dshb->dshb_csnte, "CSNTE");
  252. bfd_sym_display_table_summary (f, &dshb->dshb_clte, "CLTE");
  253. bfd_sym_display_table_summary (f, &dshb->dshb_ctte, "CTTE");
  254. bfd_sym_display_table_summary (f, &dshb->dshb_tte, "TTE");
  255. bfd_sym_display_table_summary (f, &dshb->dshb_tinfo, "TINFO");
  256. bfd_sym_display_table_summary (f, &dshb->dshb_fite, "FITE");
  257. bfd_sym_display_table_summary (f, &dshb->dshb_const, "CONST");
  258. fprintf (f, "\n");
  259. }
  260. void
  261. bfd_sym_parse_resources_table_entry_v32 (unsigned char *buf,
  262. size_t len,
  263. bfd_sym_resources_table_entry *entry)
  264. {
  265. BFD_ASSERT (len == 18);
  266. memcpy (&entry->rte_res_type, buf, 4);
  267. entry->rte_res_number = bfd_getb16 (buf + 4);
  268. entry->rte_nte_index = bfd_getb32 (buf + 6);
  269. entry->rte_mte_first = bfd_getb16 (buf + 10);
  270. entry->rte_mte_last = bfd_getb16 (buf + 12);
  271. entry->rte_res_size = bfd_getb32 (buf + 14);
  272. }
  273. void
  274. bfd_sym_parse_modules_table_entry_v33 (unsigned char *buf,
  275. size_t len,
  276. bfd_sym_modules_table_entry *entry)
  277. {
  278. BFD_ASSERT (len == 46);
  279. entry->mte_rte_index = bfd_getb16 (buf);
  280. entry->mte_res_offset = bfd_getb32 (buf + 2);
  281. entry->mte_size = bfd_getb32 (buf + 6);
  282. entry->mte_kind = buf[10];
  283. entry->mte_scope = buf[11];
  284. entry->mte_parent = bfd_getb16 (buf + 12);
  285. bfd_sym_parse_file_reference_v32 (buf + 14, 6, &entry->mte_imp_fref);
  286. entry->mte_imp_end = bfd_getb32 (buf + 20);
  287. entry->mte_nte_index = bfd_getb32 (buf + 24);
  288. entry->mte_cmte_index = bfd_getb16 (buf + 28);
  289. entry->mte_cvte_index = bfd_getb32 (buf + 30);
  290. entry->mte_clte_index = bfd_getb16 (buf + 34);
  291. entry->mte_ctte_index = bfd_getb16 (buf + 36);
  292. entry->mte_csnte_idx_1 = bfd_getb32 (buf + 38);
  293. entry->mte_csnte_idx_2 = bfd_getb32 (buf + 42);
  294. }
  295. void
  296. bfd_sym_parse_file_references_table_entry_v32 (unsigned char *buf,
  297. size_t len,
  298. bfd_sym_file_references_table_entry *entry)
  299. {
  300. unsigned int type;
  301. BFD_ASSERT (len == 10);
  302. memset (entry, 0, sizeof (bfd_sym_file_references_table_entry));
  303. type = bfd_getb16 (buf);
  304. switch (type)
  305. {
  306. case BFD_SYM_END_OF_LIST_3_2:
  307. entry->generic.type = BFD_SYM_END_OF_LIST;
  308. break;
  309. case BFD_SYM_FILE_NAME_INDEX_3_2:
  310. entry->filename.type = BFD_SYM_FILE_NAME_INDEX;
  311. entry->filename.nte_index = bfd_getb32 (buf + 2);
  312. entry->filename.mod_date = bfd_getb32 (buf + 6);
  313. break;
  314. default:
  315. entry->entry.mte_index = type;
  316. entry->entry.file_offset = bfd_getb32 (buf + 2);
  317. }
  318. }
  319. void
  320. bfd_sym_parse_contained_modules_table_entry_v32 (unsigned char *buf,
  321. size_t len,
  322. bfd_sym_contained_modules_table_entry *entry)
  323. {
  324. unsigned int type;
  325. BFD_ASSERT (len == 6);
  326. memset (entry, 0, sizeof (bfd_sym_contained_modules_table_entry));
  327. type = bfd_getb16 (buf);
  328. switch (type)
  329. {
  330. case BFD_SYM_END_OF_LIST_3_2:
  331. entry->generic.type = BFD_SYM_END_OF_LIST;
  332. break;
  333. default:
  334. entry->entry.mte_index = type;
  335. entry->entry.nte_index = bfd_getb32 (buf + 2);
  336. break;
  337. }
  338. }
  339. void
  340. bfd_sym_parse_contained_variables_table_entry_v32 (unsigned char *buf,
  341. size_t len,
  342. bfd_sym_contained_variables_table_entry *entry)
  343. {
  344. unsigned int type;
  345. BFD_ASSERT (len == 26);
  346. memset (entry, 0, sizeof (bfd_sym_contained_variables_table_entry));
  347. type = bfd_getb16 (buf);
  348. switch (type)
  349. {
  350. case BFD_SYM_END_OF_LIST_3_2:
  351. entry->generic.type = BFD_SYM_END_OF_LIST;
  352. break;
  353. case BFD_SYM_SOURCE_FILE_CHANGE_3_2:
  354. entry->file.type = BFD_SYM_SOURCE_FILE_CHANGE;
  355. bfd_sym_parse_file_reference_v32 (buf + 2, 6, &entry->file.fref);
  356. break;
  357. default:
  358. entry->entry.tte_index = type;
  359. entry->entry.nte_index = bfd_getb32 (buf + 2);
  360. entry->entry.file_delta = bfd_getb16 (buf + 6);
  361. entry->entry.scope = buf[8];
  362. entry->entry.la_size = buf[9];
  363. if (entry->entry.la_size == BFD_SYM_CVTE_SCA)
  364. {
  365. entry->entry.address.scstruct.sca_kind = buf[10];
  366. entry->entry.address.scstruct.sca_class = buf[11];
  367. entry->entry.address.scstruct.sca_offset = bfd_getb32 (buf + 12);
  368. }
  369. else if (entry->entry.la_size <= BFD_SYM_CVTE_SCA)
  370. {
  371. #if BFD_SYM_CVTE_SCA > 0
  372. memcpy (&entry->entry.address.lastruct.la, buf + 10,
  373. BFD_SYM_CVTE_SCA);
  374. #endif
  375. entry->entry.address.lastruct.la_kind = buf[23];
  376. }
  377. else if (entry->entry.la_size == BFD_SYM_CVTE_BIG_LA)
  378. {
  379. entry->entry.address.biglastruct.big_la = bfd_getb32 (buf + 10);
  380. entry->entry.address.biglastruct.big_la_kind = buf[12];
  381. }
  382. }
  383. }
  384. void
  385. bfd_sym_parse_contained_statements_table_entry_v32 (unsigned char *buf,
  386. size_t len,
  387. bfd_sym_contained_statements_table_entry *entry)
  388. {
  389. unsigned int type;
  390. BFD_ASSERT (len == 8);
  391. memset (entry, 0, sizeof (bfd_sym_contained_statements_table_entry));
  392. type = bfd_getb16 (buf);
  393. switch (type)
  394. {
  395. case BFD_SYM_END_OF_LIST_3_2:
  396. entry->generic.type = BFD_SYM_END_OF_LIST;
  397. break;
  398. case BFD_SYM_SOURCE_FILE_CHANGE_3_2:
  399. entry->file.type = BFD_SYM_SOURCE_FILE_CHANGE;
  400. bfd_sym_parse_file_reference_v32 (buf + 2, 6, &entry->file.fref);
  401. break;
  402. default:
  403. entry->entry.mte_index = type;
  404. entry->entry.mte_offset = bfd_getb16 (buf + 2);
  405. entry->entry.file_delta = bfd_getb32 (buf + 4);
  406. break;
  407. }
  408. }
  409. void
  410. bfd_sym_parse_contained_labels_table_entry_v32 (unsigned char *buf,
  411. size_t len,
  412. bfd_sym_contained_labels_table_entry *entry)
  413. {
  414. unsigned int type;
  415. BFD_ASSERT (len == 12);
  416. memset (entry, 0, sizeof (bfd_sym_contained_labels_table_entry));
  417. type = bfd_getb16 (buf);
  418. switch (type)
  419. {
  420. case BFD_SYM_END_OF_LIST_3_2:
  421. entry->generic.type = BFD_SYM_END_OF_LIST;
  422. break;
  423. case BFD_SYM_SOURCE_FILE_CHANGE_3_2:
  424. entry->file.type = BFD_SYM_SOURCE_FILE_CHANGE;
  425. bfd_sym_parse_file_reference_v32 (buf + 2, 6, &entry->file.fref);
  426. break;
  427. default:
  428. entry->entry.mte_index = type;
  429. entry->entry.mte_offset = bfd_getb16 (buf + 2);
  430. entry->entry.nte_index = bfd_getb32 (buf + 4);
  431. entry->entry.file_delta = bfd_getb16 (buf + 8);
  432. entry->entry.scope = bfd_getb16 (buf + 10);
  433. break;
  434. }
  435. }
  436. void
  437. bfd_sym_parse_type_table_entry_v32 (unsigned char *buf,
  438. size_t len,
  439. bfd_sym_type_table_entry *entry)
  440. {
  441. BFD_ASSERT (len == 4);
  442. *entry = bfd_getb32 (buf);
  443. }
  444. int
  445. bfd_sym_fetch_resources_table_entry (bfd *abfd,
  446. bfd_sym_resources_table_entry *entry,
  447. unsigned long sym_index)
  448. {
  449. void (*parser) (unsigned char *, size_t, bfd_sym_resources_table_entry *);
  450. unsigned long offset;
  451. unsigned long entry_size;
  452. unsigned char buf[18];
  453. bfd_sym_data_struct *sdata = NULL;
  454. parser = NULL;
  455. BFD_ASSERT (bfd_sym_valid (abfd));
  456. sdata = abfd->tdata.sym_data;
  457. if (sym_index == 0)
  458. return -1;
  459. switch (sdata->version)
  460. {
  461. case BFD_SYM_VERSION_3_5:
  462. case BFD_SYM_VERSION_3_4:
  463. return -1;
  464. case BFD_SYM_VERSION_3_3:
  465. case BFD_SYM_VERSION_3_2:
  466. entry_size = 18;
  467. parser = bfd_sym_parse_resources_table_entry_v32;
  468. break;
  469. case BFD_SYM_VERSION_3_1:
  470. default:
  471. return -1;
  472. }
  473. if (parser == NULL)
  474. return -1;
  475. offset = compute_offset (sdata->header.dshb_rte.dti_first_page,
  476. sdata->header.dshb_page_size,
  477. entry_size, sym_index);
  478. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  479. return -1;
  480. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  481. return -1;
  482. (*parser) (buf, entry_size, entry);
  483. return 0;
  484. }
  485. int
  486. bfd_sym_fetch_modules_table_entry (bfd *abfd,
  487. bfd_sym_modules_table_entry *entry,
  488. unsigned long sym_index)
  489. {
  490. void (*parser) (unsigned char *, size_t, bfd_sym_modules_table_entry *);
  491. unsigned long offset;
  492. unsigned long entry_size;
  493. unsigned char buf[46];
  494. bfd_sym_data_struct *sdata = NULL;
  495. parser = NULL;
  496. BFD_ASSERT (bfd_sym_valid (abfd));
  497. sdata = abfd->tdata.sym_data;
  498. if (sym_index == 0)
  499. return -1;
  500. switch (sdata->version)
  501. {
  502. case BFD_SYM_VERSION_3_5:
  503. case BFD_SYM_VERSION_3_4:
  504. return -1;
  505. case BFD_SYM_VERSION_3_3:
  506. entry_size = 46;
  507. parser = bfd_sym_parse_modules_table_entry_v33;
  508. break;
  509. case BFD_SYM_VERSION_3_2:
  510. case BFD_SYM_VERSION_3_1:
  511. default:
  512. return -1;
  513. }
  514. if (parser == NULL)
  515. return -1;
  516. offset = compute_offset (sdata->header.dshb_mte.dti_first_page,
  517. sdata->header.dshb_page_size,
  518. entry_size, sym_index);
  519. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  520. return -1;
  521. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  522. return -1;
  523. (*parser) (buf, entry_size, entry);
  524. return 0;
  525. }
  526. int
  527. bfd_sym_fetch_file_references_table_entry (bfd *abfd,
  528. bfd_sym_file_references_table_entry *entry,
  529. unsigned long sym_index)
  530. {
  531. void (*parser) (unsigned char *, size_t, bfd_sym_file_references_table_entry *);
  532. unsigned long offset;
  533. unsigned long entry_size = 0;
  534. unsigned char buf[8];
  535. bfd_sym_data_struct *sdata = NULL;
  536. parser = NULL;
  537. BFD_ASSERT (bfd_sym_valid (abfd));
  538. sdata = abfd->tdata.sym_data;
  539. if (sym_index == 0)
  540. return -1;
  541. switch (sdata->version)
  542. {
  543. case BFD_SYM_VERSION_3_3:
  544. case BFD_SYM_VERSION_3_2:
  545. entry_size = 10;
  546. parser = bfd_sym_parse_file_references_table_entry_v32;
  547. break;
  548. case BFD_SYM_VERSION_3_5:
  549. case BFD_SYM_VERSION_3_4:
  550. case BFD_SYM_VERSION_3_1:
  551. default:
  552. break;
  553. }
  554. if (parser == NULL)
  555. return -1;
  556. offset = compute_offset (sdata->header.dshb_frte.dti_first_page,
  557. sdata->header.dshb_page_size,
  558. entry_size, sym_index);
  559. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  560. return -1;
  561. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  562. return -1;
  563. (*parser) (buf, entry_size, entry);
  564. return 0;
  565. }
  566. int
  567. bfd_sym_fetch_contained_modules_table_entry (bfd *abfd,
  568. bfd_sym_contained_modules_table_entry *entry,
  569. unsigned long sym_index)
  570. {
  571. void (*parser) (unsigned char *, size_t, bfd_sym_contained_modules_table_entry *);
  572. unsigned long offset;
  573. unsigned long entry_size = 0;
  574. unsigned char buf[6];
  575. bfd_sym_data_struct *sdata = NULL;
  576. parser = NULL;
  577. BFD_ASSERT (bfd_sym_valid (abfd));
  578. sdata = abfd->tdata.sym_data;
  579. if (sym_index == 0)
  580. return -1;
  581. switch (sdata->version)
  582. {
  583. case BFD_SYM_VERSION_3_3:
  584. case BFD_SYM_VERSION_3_2:
  585. entry_size = 6;
  586. parser = bfd_sym_parse_contained_modules_table_entry_v32;
  587. break;
  588. case BFD_SYM_VERSION_3_5:
  589. case BFD_SYM_VERSION_3_4:
  590. case BFD_SYM_VERSION_3_1:
  591. default:
  592. break;
  593. }
  594. if (parser == NULL)
  595. return -1;
  596. offset = compute_offset (sdata->header.dshb_cmte.dti_first_page,
  597. sdata->header.dshb_page_size,
  598. entry_size, sym_index);
  599. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  600. return -1;
  601. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  602. return -1;
  603. (*parser) (buf, entry_size, entry);
  604. return 0;
  605. }
  606. int
  607. bfd_sym_fetch_contained_variables_table_entry (bfd *abfd,
  608. bfd_sym_contained_variables_table_entry *entry,
  609. unsigned long sym_index)
  610. {
  611. void (*parser) (unsigned char *, size_t, bfd_sym_contained_variables_table_entry *);
  612. unsigned long offset;
  613. unsigned long entry_size = 0;
  614. unsigned char buf[26];
  615. bfd_sym_data_struct *sdata = NULL;
  616. parser = NULL;
  617. BFD_ASSERT (bfd_sym_valid (abfd));
  618. sdata = abfd->tdata.sym_data;
  619. if (sym_index == 0)
  620. return -1;
  621. switch (sdata->version)
  622. {
  623. case BFD_SYM_VERSION_3_3:
  624. case BFD_SYM_VERSION_3_2:
  625. entry_size = 26;
  626. parser = bfd_sym_parse_contained_variables_table_entry_v32;
  627. break;
  628. case BFD_SYM_VERSION_3_5:
  629. case BFD_SYM_VERSION_3_4:
  630. case BFD_SYM_VERSION_3_1:
  631. default:
  632. break;
  633. }
  634. if (parser == NULL)
  635. return -1;
  636. offset = compute_offset (sdata->header.dshb_cvte.dti_first_page,
  637. sdata->header.dshb_page_size,
  638. entry_size, sym_index);
  639. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  640. return -1;
  641. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  642. return -1;
  643. (*parser) (buf, entry_size, entry);
  644. return 0;
  645. }
  646. int
  647. bfd_sym_fetch_contained_statements_table_entry (bfd *abfd,
  648. bfd_sym_contained_statements_table_entry *entry,
  649. unsigned long sym_index)
  650. {
  651. void (*parser) (unsigned char *, size_t, bfd_sym_contained_statements_table_entry *);
  652. unsigned long offset;
  653. unsigned long entry_size = 0;
  654. unsigned char buf[8];
  655. bfd_sym_data_struct *sdata = NULL;
  656. parser = NULL;
  657. BFD_ASSERT (bfd_sym_valid (abfd));
  658. sdata = abfd->tdata.sym_data;
  659. if (sym_index == 0)
  660. return -1;
  661. switch (sdata->version)
  662. {
  663. case BFD_SYM_VERSION_3_3:
  664. case BFD_SYM_VERSION_3_2:
  665. entry_size = 8;
  666. parser = bfd_sym_parse_contained_statements_table_entry_v32;
  667. break;
  668. case BFD_SYM_VERSION_3_5:
  669. case BFD_SYM_VERSION_3_4:
  670. case BFD_SYM_VERSION_3_1:
  671. default:
  672. break;
  673. }
  674. if (parser == NULL)
  675. return -1;
  676. offset = compute_offset (sdata->header.dshb_csnte.dti_first_page,
  677. sdata->header.dshb_page_size,
  678. entry_size, sym_index);
  679. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  680. return -1;
  681. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  682. return -1;
  683. (*parser) (buf, entry_size, entry);
  684. return 0;
  685. }
  686. int
  687. bfd_sym_fetch_contained_labels_table_entry (bfd *abfd,
  688. bfd_sym_contained_labels_table_entry *entry,
  689. unsigned long sym_index)
  690. {
  691. void (*parser) (unsigned char *, size_t, bfd_sym_contained_labels_table_entry *);
  692. unsigned long offset;
  693. unsigned long entry_size = 0;
  694. unsigned char buf[12];
  695. bfd_sym_data_struct *sdata = NULL;
  696. parser = NULL;
  697. BFD_ASSERT (bfd_sym_valid (abfd));
  698. sdata = abfd->tdata.sym_data;
  699. if (sym_index == 0)
  700. return -1;
  701. switch (sdata->version)
  702. {
  703. case BFD_SYM_VERSION_3_3:
  704. case BFD_SYM_VERSION_3_2:
  705. entry_size = 12;
  706. parser = bfd_sym_parse_contained_labels_table_entry_v32;
  707. break;
  708. case BFD_SYM_VERSION_3_5:
  709. case BFD_SYM_VERSION_3_4:
  710. case BFD_SYM_VERSION_3_1:
  711. default:
  712. break;
  713. }
  714. if (parser == NULL)
  715. return -1;
  716. offset = compute_offset (sdata->header.dshb_clte.dti_first_page,
  717. sdata->header.dshb_page_size,
  718. entry_size, sym_index);
  719. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  720. return -1;
  721. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  722. return -1;
  723. (*parser) (buf, entry_size, entry);
  724. return 0;
  725. }
  726. int
  727. bfd_sym_fetch_contained_types_table_entry (bfd *abfd,
  728. bfd_sym_contained_types_table_entry *entry,
  729. unsigned long sym_index)
  730. {
  731. void (*parser) (unsigned char *, size_t, bfd_sym_contained_types_table_entry *);
  732. unsigned long offset;
  733. unsigned long entry_size = 0;
  734. unsigned char buf[0];
  735. bfd_sym_data_struct *sdata = NULL;
  736. parser = NULL;
  737. BFD_ASSERT (bfd_sym_valid (abfd));
  738. sdata = abfd->tdata.sym_data;
  739. if (sym_index == 0)
  740. return -1;
  741. switch (sdata->version)
  742. {
  743. case BFD_SYM_VERSION_3_3:
  744. case BFD_SYM_VERSION_3_2:
  745. entry_size = 0;
  746. parser = NULL;
  747. break;
  748. case BFD_SYM_VERSION_3_5:
  749. case BFD_SYM_VERSION_3_4:
  750. case BFD_SYM_VERSION_3_1:
  751. default:
  752. break;
  753. }
  754. if (parser == NULL)
  755. return -1;
  756. offset = compute_offset (sdata->header.dshb_ctte.dti_first_page,
  757. sdata->header.dshb_page_size,
  758. entry_size, sym_index);
  759. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  760. return -1;
  761. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  762. return -1;
  763. (*parser) (buf, entry_size, entry);
  764. return 0;
  765. }
  766. int
  767. bfd_sym_fetch_file_references_index_table_entry (bfd *abfd,
  768. bfd_sym_file_references_index_table_entry *entry,
  769. unsigned long sym_index)
  770. {
  771. void (*parser) (unsigned char *, size_t, bfd_sym_file_references_index_table_entry *);
  772. unsigned long offset;
  773. unsigned long entry_size = 0;
  774. unsigned char buf[0];
  775. bfd_sym_data_struct *sdata = NULL;
  776. parser = NULL;
  777. BFD_ASSERT (bfd_sym_valid (abfd));
  778. sdata = abfd->tdata.sym_data;
  779. if (sym_index == 0)
  780. return -1;
  781. switch (sdata->version)
  782. {
  783. case BFD_SYM_VERSION_3_3:
  784. case BFD_SYM_VERSION_3_2:
  785. entry_size = 0;
  786. parser = NULL;
  787. break;
  788. case BFD_SYM_VERSION_3_5:
  789. case BFD_SYM_VERSION_3_4:
  790. case BFD_SYM_VERSION_3_1:
  791. default:
  792. break;
  793. }
  794. if (parser == NULL)
  795. return -1;
  796. offset = compute_offset (sdata->header.dshb_fite.dti_first_page,
  797. sdata->header.dshb_page_size,
  798. entry_size, sym_index);
  799. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  800. return -1;
  801. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  802. return -1;
  803. (*parser) (buf, entry_size, entry);
  804. return 0;
  805. }
  806. int
  807. bfd_sym_fetch_constant_pool_entry (bfd *abfd,
  808. bfd_sym_constant_pool_entry *entry,
  809. unsigned long sym_index)
  810. {
  811. void (*parser) (unsigned char *, size_t, bfd_sym_constant_pool_entry *);
  812. unsigned long offset;
  813. unsigned long entry_size = 0;
  814. unsigned char buf[0];
  815. bfd_sym_data_struct *sdata = NULL;
  816. parser = NULL;
  817. BFD_ASSERT (bfd_sym_valid (abfd));
  818. sdata = abfd->tdata.sym_data;
  819. if (sym_index == 0)
  820. return -1;
  821. switch (sdata->version)
  822. {
  823. case BFD_SYM_VERSION_3_3:
  824. case BFD_SYM_VERSION_3_2:
  825. entry_size = 0;
  826. parser = NULL;
  827. break;
  828. case BFD_SYM_VERSION_3_5:
  829. case BFD_SYM_VERSION_3_4:
  830. case BFD_SYM_VERSION_3_1:
  831. default:
  832. break;
  833. }
  834. if (parser == NULL)
  835. return -1;
  836. offset = compute_offset (sdata->header.dshb_fite.dti_first_page,
  837. sdata->header.dshb_page_size,
  838. entry_size, sym_index);
  839. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  840. return -1;
  841. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  842. return -1;
  843. (*parser) (buf, entry_size, entry);
  844. return 0;
  845. }
  846. int
  847. bfd_sym_fetch_type_table_entry (bfd *abfd,
  848. bfd_sym_type_table_entry *entry,
  849. unsigned long sym_index)
  850. {
  851. void (*parser) (unsigned char *, size_t, bfd_sym_type_table_entry *);
  852. unsigned long offset;
  853. unsigned long entry_size = 0;
  854. unsigned char buf[4];
  855. bfd_sym_data_struct *sdata = NULL;
  856. parser = NULL;
  857. BFD_ASSERT (bfd_sym_valid (abfd));
  858. sdata = abfd->tdata.sym_data;
  859. switch (sdata->version)
  860. {
  861. case BFD_SYM_VERSION_3_3:
  862. case BFD_SYM_VERSION_3_2:
  863. entry_size = 4;
  864. parser = bfd_sym_parse_type_table_entry_v32;
  865. break;
  866. case BFD_SYM_VERSION_3_5:
  867. case BFD_SYM_VERSION_3_4:
  868. case BFD_SYM_VERSION_3_1:
  869. default:
  870. break;
  871. }
  872. if (parser == NULL)
  873. return -1;
  874. offset = compute_offset (sdata->header.dshb_tte.dti_first_page,
  875. sdata->header.dshb_page_size,
  876. entry_size, sym_index);
  877. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  878. return -1;
  879. if (bfd_bread (buf, entry_size, abfd) != entry_size)
  880. return -1;
  881. (*parser) (buf, entry_size, entry);
  882. return 0;
  883. }
  884. int
  885. bfd_sym_fetch_type_information_table_entry (bfd *abfd,
  886. bfd_sym_type_information_table_entry *entry,
  887. unsigned long offset)
  888. {
  889. unsigned char buf[4];
  890. BFD_ASSERT (bfd_sym_valid (abfd));
  891. if (offset == 0)
  892. return -1;
  893. if (bfd_seek (abfd, offset, SEEK_SET) < 0)
  894. return -1;
  895. if (bfd_bread (buf, 4, abfd) != 4)
  896. return -1;
  897. entry->nte_index = bfd_getb32 (buf);
  898. if (bfd_bread (buf, 2, abfd) != 2)
  899. return -1;
  900. entry->physical_size = bfd_getb16 (buf);
  901. if (entry->physical_size & 0x8000)
  902. {
  903. if (bfd_bread (buf, 4, abfd) != 4)
  904. return -1;
  905. entry->physical_size &= 0x7fff;
  906. entry->logical_size = bfd_getb32 (buf);
  907. entry->offset = offset + 10;
  908. }
  909. else
  910. {
  911. if (bfd_bread (buf, 2, abfd) != 2)
  912. return -1;
  913. entry->physical_size &= 0x7fff;
  914. entry->logical_size = bfd_getb16 (buf);
  915. entry->offset = offset + 8;
  916. }
  917. return 0;
  918. }
  919. int
  920. bfd_sym_fetch_type_table_information (bfd *abfd,
  921. bfd_sym_type_information_table_entry *entry,
  922. unsigned long sym_index)
  923. {
  924. bfd_sym_type_table_entry tindex;
  925. bfd_sym_data_struct *sdata = NULL;
  926. BFD_ASSERT (bfd_sym_valid (abfd));
  927. sdata = abfd->tdata.sym_data;
  928. if (sdata->header.dshb_tte.dti_object_count <= 99)
  929. return -1;
  930. if (sym_index < 100)
  931. return -1;
  932. if (bfd_sym_fetch_type_table_entry (abfd, &tindex, sym_index - 100) < 0)
  933. return -1;
  934. if (bfd_sym_fetch_type_information_table_entry (abfd, entry, tindex) < 0)
  935. return -1;
  936. return 0;
  937. }
  938. const unsigned char *
  939. bfd_sym_symbol_name (bfd *abfd, unsigned long sym_index)
  940. {
  941. bfd_sym_data_struct *sdata = NULL;
  942. BFD_ASSERT (bfd_sym_valid (abfd));
  943. sdata = abfd->tdata.sym_data;
  944. if (sym_index == 0)
  945. return (const unsigned char *) "";
  946. sym_index *= 2;
  947. if ((sym_index / sdata->header.dshb_page_size)
  948. > sdata->header.dshb_nte.dti_page_count)
  949. return (const unsigned char *) "\09[INVALID]";
  950. return (const unsigned char *) sdata->name_table + sym_index;
  951. }
  952. const unsigned char *
  953. bfd_sym_module_name (bfd *abfd, unsigned long sym_index)
  954. {
  955. bfd_sym_modules_table_entry entry;
  956. if (bfd_sym_fetch_modules_table_entry (abfd, &entry, sym_index) < 0)
  957. return (const unsigned char *) "\09[INVALID]";
  958. return bfd_sym_symbol_name (abfd, entry.mte_nte_index);
  959. }
  960. const char *
  961. bfd_sym_unparse_storage_kind (enum bfd_sym_storage_kind kind)
  962. {
  963. switch (kind)
  964. {
  965. case BFD_SYM_STORAGE_KIND_LOCAL: return "LOCAL";
  966. case BFD_SYM_STORAGE_KIND_VALUE: return "VALUE";
  967. case BFD_SYM_STORAGE_KIND_REFERENCE: return "REFERENCE";
  968. case BFD_SYM_STORAGE_KIND_WITH: return "WITH";
  969. default: return "[UNKNOWN]";
  970. }
  971. }
  972. const char *
  973. bfd_sym_unparse_storage_class (enum bfd_sym_storage_class kind)
  974. {
  975. switch (kind)
  976. {
  977. case BFD_SYM_STORAGE_CLASS_REGISTER: return "REGISTER";
  978. case BFD_SYM_STORAGE_CLASS_GLOBAL: return "GLOBAL";
  979. case BFD_SYM_STORAGE_CLASS_FRAME_RELATIVE: return "FRAME_RELATIVE";
  980. case BFD_SYM_STORAGE_CLASS_STACK_RELATIVE: return "STACK_RELATIVE";
  981. case BFD_SYM_STORAGE_CLASS_ABSOLUTE: return "ABSOLUTE";
  982. case BFD_SYM_STORAGE_CLASS_CONSTANT: return "CONSTANT";
  983. case BFD_SYM_STORAGE_CLASS_RESOURCE: return "RESOURCE";
  984. case BFD_SYM_STORAGE_CLASS_BIGCONSTANT: return "BIGCONSTANT";
  985. default: return "[UNKNOWN]";
  986. }
  987. }
  988. const char *
  989. bfd_sym_unparse_module_kind (enum bfd_sym_module_kind kind)
  990. {
  991. switch (kind)
  992. {
  993. case BFD_SYM_MODULE_KIND_NONE: return "NONE";
  994. case BFD_SYM_MODULE_KIND_PROGRAM: return "PROGRAM";
  995. case BFD_SYM_MODULE_KIND_UNIT: return "UNIT";
  996. case BFD_SYM_MODULE_KIND_PROCEDURE: return "PROCEDURE";
  997. case BFD_SYM_MODULE_KIND_FUNCTION: return "FUNCTION";
  998. case BFD_SYM_MODULE_KIND_DATA: return "DATA";
  999. case BFD_SYM_MODULE_KIND_BLOCK: return "BLOCK";
  1000. default: return "[UNKNOWN]";
  1001. }
  1002. }
  1003. const char *
  1004. bfd_sym_unparse_symbol_scope (enum bfd_sym_symbol_scope scope)
  1005. {
  1006. switch (scope)
  1007. {
  1008. case BFD_SYM_SYMBOL_SCOPE_LOCAL: return "LOCAL";
  1009. case BFD_SYM_SYMBOL_SCOPE_GLOBAL: return "GLOBAL";
  1010. default:
  1011. return "[UNKNOWN]";
  1012. }
  1013. }
  1014. void
  1015. bfd_sym_print_file_reference (bfd *abfd,
  1016. FILE *f,
  1017. bfd_sym_file_reference *entry)
  1018. {
  1019. bfd_sym_file_references_table_entry frtentry;
  1020. int ret;
  1021. ret = bfd_sym_fetch_file_references_table_entry (abfd, &frtentry,
  1022. entry->fref_frte_index);
  1023. fprintf (f, "FILE ");
  1024. if ((ret < 0) || (frtentry.generic.type != BFD_SYM_FILE_NAME_INDEX))
  1025. fprintf (f, "[INVALID]");
  1026. else
  1027. fprintf (f, "\"%.*s\"",
  1028. bfd_sym_symbol_name (abfd, frtentry.filename.nte_index)[0],
  1029. &bfd_sym_symbol_name (abfd, frtentry.filename.nte_index)[1]);
  1030. fprintf (f, " (FRTE %lu)", entry->fref_frte_index);
  1031. }
  1032. void
  1033. bfd_sym_print_resources_table_entry (bfd *abfd,
  1034. FILE *f,
  1035. bfd_sym_resources_table_entry *entry)
  1036. {
  1037. fprintf (f, " \"%.*s\" (NTE %lu), type \"%.4s\", num %u, size %lu, MTE %lu -- %lu",
  1038. bfd_sym_symbol_name (abfd, entry->rte_nte_index)[0],
  1039. &bfd_sym_symbol_name (abfd, entry->rte_nte_index)[1],
  1040. entry->rte_nte_index, entry->rte_res_type, entry->rte_res_number,
  1041. entry->rte_res_size, entry->rte_mte_first, entry->rte_mte_last);
  1042. }
  1043. void
  1044. bfd_sym_print_modules_table_entry (bfd *abfd,
  1045. FILE *f,
  1046. bfd_sym_modules_table_entry *entry)
  1047. {
  1048. fprintf (f, "\"%.*s\" (NTE %lu)",
  1049. bfd_sym_symbol_name (abfd, entry->mte_nte_index)[0],
  1050. &bfd_sym_symbol_name (abfd, entry->mte_nte_index)[1],
  1051. entry->mte_nte_index);
  1052. fprintf (f, "\n ");
  1053. bfd_sym_print_file_reference (abfd, f, &entry->mte_imp_fref);
  1054. fprintf (f, " range %lu -- %lu",
  1055. entry->mte_imp_fref.fref_offset, entry->mte_imp_end);
  1056. fprintf (f, "\n ");
  1057. fprintf (f, "kind %s", bfd_sym_unparse_module_kind (entry->mte_kind));
  1058. fprintf (f, ", scope %s", bfd_sym_unparse_symbol_scope (entry->mte_scope));
  1059. fprintf (f, ", RTE %lu, offset %lu, size %lu",
  1060. entry->mte_rte_index, entry->mte_res_offset, entry->mte_size);
  1061. fprintf (f, "\n ");
  1062. fprintf (f, "CMTE %lu, CVTE %lu, CLTE %lu, CTTE %lu, CSNTE1 %lu, CSNTE2 %lu",
  1063. entry->mte_cmte_index, entry->mte_cvte_index,
  1064. entry->mte_clte_index, entry->mte_ctte_index,
  1065. entry->mte_csnte_idx_1, entry->mte_csnte_idx_2);
  1066. if (entry->mte_parent != 0)
  1067. fprintf (f, ", parent %lu", entry->mte_parent);
  1068. else
  1069. fprintf (f, ", no parent");
  1070. if (entry->mte_cmte_index != 0)
  1071. fprintf (f, ", child %lu", entry->mte_cmte_index);
  1072. else
  1073. fprintf (f, ", no child");
  1074. }
  1075. void
  1076. bfd_sym_print_file_references_table_entry (bfd *abfd,
  1077. FILE *f,
  1078. bfd_sym_file_references_table_entry *entry)
  1079. {
  1080. switch (entry->generic.type)
  1081. {
  1082. case BFD_SYM_FILE_NAME_INDEX:
  1083. fprintf (f, "FILE \"%.*s\" (NTE %lu), modtime ",
  1084. bfd_sym_symbol_name (abfd, entry->filename.nte_index)[0],
  1085. &bfd_sym_symbol_name (abfd, entry->filename.nte_index)[1],
  1086. entry->filename.nte_index);
  1087. fprintf (f, "[UNIMPLEMENTED]");
  1088. /* printModDate (entry->filename.mod_date); */
  1089. fprintf (f, " (0x%lx)", entry->filename.mod_date);
  1090. break;
  1091. case BFD_SYM_END_OF_LIST:
  1092. fprintf (f, "END");
  1093. break;
  1094. default:
  1095. fprintf (f, "\"%.*s\" (MTE %lu), offset %lu",
  1096. bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
  1097. &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
  1098. entry->entry.mte_index,
  1099. entry->entry.file_offset);
  1100. break;
  1101. }
  1102. }
  1103. void
  1104. bfd_sym_print_contained_modules_table_entry (bfd *abfd,
  1105. FILE *f,
  1106. bfd_sym_contained_modules_table_entry *entry)
  1107. {
  1108. switch (entry->generic.type)
  1109. {
  1110. case BFD_SYM_END_OF_LIST:
  1111. fprintf (f, "END");
  1112. break;
  1113. default:
  1114. fprintf (f, "\"%.*s\" (MTE %lu, NTE %lu)",
  1115. bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
  1116. &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
  1117. entry->entry.mte_index,
  1118. entry->entry.nte_index);
  1119. break;
  1120. }
  1121. }
  1122. void
  1123. bfd_sym_print_contained_variables_table_entry (bfd *abfd,
  1124. FILE *f,
  1125. bfd_sym_contained_variables_table_entry *entry)
  1126. {
  1127. if (entry->generic.type == BFD_SYM_END_OF_LIST)
  1128. {
  1129. fprintf (f, "END");
  1130. return;
  1131. }
  1132. if (entry->generic.type == BFD_SYM_SOURCE_FILE_CHANGE)
  1133. {
  1134. bfd_sym_print_file_reference (abfd, f, &entry->file.fref);
  1135. fprintf (f, " offset %lu", entry->file.fref.fref_offset);
  1136. return;
  1137. }
  1138. fprintf (f, "\"%.*s\" (NTE %lu)",
  1139. bfd_sym_symbol_name (abfd, entry->entry.nte_index)[0],
  1140. &bfd_sym_symbol_name (abfd, entry->entry.nte_index)[1],
  1141. entry->entry.nte_index);
  1142. fprintf (f, ", TTE %lu", entry->entry.tte_index);
  1143. fprintf (f, ", offset %lu", entry->entry.file_delta);
  1144. fprintf (f, ", scope %s", bfd_sym_unparse_symbol_scope (entry->entry.scope));
  1145. if (entry->entry.la_size == BFD_SYM_CVTE_SCA)
  1146. fprintf (f, ", latype %s, laclass %s, laoffset %lu",
  1147. bfd_sym_unparse_storage_kind (entry->entry.address.scstruct.sca_kind),
  1148. bfd_sym_unparse_storage_class (entry->entry.address.scstruct.sca_class),
  1149. entry->entry.address.scstruct.sca_offset);
  1150. else if (entry->entry.la_size <= BFD_SYM_CVTE_LA_MAX_SIZE)
  1151. {
  1152. unsigned long i;
  1153. fprintf (f, ", la [");
  1154. for (i = 0; i < entry->entry.la_size; i++)
  1155. fprintf (f, "0x%02x ", entry->entry.address.lastruct.la[i]);
  1156. fprintf (f, "]");
  1157. }
  1158. else if (entry->entry.la_size == BFD_SYM_CVTE_BIG_LA)
  1159. fprintf (f, ", bigla %lu, biglakind %u",
  1160. entry->entry.address.biglastruct.big_la,
  1161. entry->entry.address.biglastruct.big_la_kind);
  1162. else
  1163. fprintf (f, ", la [INVALID]");
  1164. }
  1165. void
  1166. bfd_sym_print_contained_statements_table_entry (bfd *abfd,
  1167. FILE *f,
  1168. bfd_sym_contained_statements_table_entry *entry)
  1169. {
  1170. if (entry->generic.type == BFD_SYM_END_OF_LIST)
  1171. {
  1172. fprintf (f, "END");
  1173. return;
  1174. }
  1175. if (entry->generic.type == BFD_SYM_SOURCE_FILE_CHANGE)
  1176. {
  1177. bfd_sym_print_file_reference (abfd, f, &entry->file.fref);
  1178. fprintf (f, " offset %lu", entry->file.fref.fref_offset);
  1179. return;
  1180. }
  1181. fprintf (f, "\"%.*s\" (MTE %lu), offset %lu, delta %lu",
  1182. bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
  1183. &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
  1184. entry->entry.mte_index,
  1185. entry->entry.mte_offset,
  1186. entry->entry.file_delta);
  1187. }
  1188. void
  1189. bfd_sym_print_contained_labels_table_entry (bfd *abfd,
  1190. FILE *f,
  1191. bfd_sym_contained_labels_table_entry *entry)
  1192. {
  1193. if (entry->generic.type == BFD_SYM_END_OF_LIST)
  1194. {
  1195. fprintf (f, "END");
  1196. return;
  1197. }
  1198. if (entry->generic.type == BFD_SYM_SOURCE_FILE_CHANGE)
  1199. {
  1200. bfd_sym_print_file_reference (abfd, f, &entry->file.fref);
  1201. fprintf (f, " offset %lu", entry->file.fref.fref_offset);
  1202. return;
  1203. }
  1204. fprintf (f, "\"%.*s\" (MTE %lu), offset %lu, delta %lu, scope %s",
  1205. bfd_sym_module_name (abfd, entry->entry.mte_index)[0],
  1206. &bfd_sym_module_name (abfd, entry->entry.mte_index)[1],
  1207. entry->entry.mte_index,
  1208. entry->entry.mte_offset,
  1209. entry->entry.file_delta,
  1210. bfd_sym_unparse_symbol_scope (entry->entry.scope));
  1211. }
  1212. void
  1213. bfd_sym_print_contained_types_table_entry (bfd *abfd ATTRIBUTE_UNUSED,
  1214. FILE *f,
  1215. bfd_sym_contained_types_table_entry *entry ATTRIBUTE_UNUSED)
  1216. {
  1217. fprintf (f, "[UNIMPLEMENTED]");
  1218. }
  1219. const char *
  1220. bfd_sym_type_operator_name (unsigned char num)
  1221. {
  1222. switch (num)
  1223. {
  1224. case 1: return "TTE";
  1225. case 2: return "PointerTo";
  1226. case 3: return "ScalarOf";
  1227. case 4: return "ConstantOf";
  1228. case 5: return "EnumerationOf";
  1229. case 6: return "VectorOf";
  1230. case 7: return "RecordOf";
  1231. case 8: return "UnionOf";
  1232. case 9: return "SubRangeOf";
  1233. case 10: return "SetOf";
  1234. case 11: return "NamedTypeOf";
  1235. case 12: return "ProcOf";
  1236. case 13: return "ValueOf";
  1237. case 14: return "ArrayOf";
  1238. default: return "[UNKNOWN OPERATOR]";
  1239. }
  1240. }
  1241. const char *
  1242. bfd_sym_type_basic_name (unsigned char num)
  1243. {
  1244. switch (num)
  1245. {
  1246. case 0: return "void";
  1247. case 1: return "pascal string";
  1248. case 2: return "unsigned long";
  1249. case 3: return "signed long";
  1250. case 4: return "extended (10 bytes)";
  1251. case 5: return "pascal boolean (1 byte)";
  1252. case 6: return "unsigned byte";
  1253. case 7: return "signed byte";
  1254. case 8: return "character (1 byte)";
  1255. case 9: return "wide character (2 bytes)";
  1256. case 10: return "unsigned short";
  1257. case 11: return "signed short";
  1258. case 12: return "singled";
  1259. case 13: return "double";
  1260. case 14: return "extended (12 bytes)";
  1261. case 15: return "computational (8 bytes)";
  1262. case 16: return "c string";
  1263. case 17: return "as-is string";
  1264. default: return "[UNKNOWN BASIC TYPE]";
  1265. }
  1266. }
  1267. int
  1268. bfd_sym_fetch_long (unsigned char *buf,
  1269. unsigned long len,
  1270. unsigned long offset,
  1271. unsigned long *offsetptr,
  1272. long *value)
  1273. {
  1274. int ret;
  1275. if (offset >= len)
  1276. {
  1277. *value = 0;
  1278. offset += 0;
  1279. ret = -1;
  1280. }
  1281. else if (! (buf[offset] & 0x80))
  1282. {
  1283. *value = buf[offset];
  1284. offset += 1;
  1285. ret = 0;
  1286. }
  1287. else if (buf[offset] == 0xc0)
  1288. {
  1289. if ((offset + 5) > len)
  1290. {
  1291. *value = 0;
  1292. offset = len;
  1293. ret = -1;
  1294. }
  1295. else
  1296. {
  1297. *value = bfd_getb32 (buf + offset + 1);
  1298. offset += 5;
  1299. ret = 0;
  1300. }
  1301. }
  1302. else if ((buf[offset] & 0xc0) == 0xc0)
  1303. {
  1304. *value = -(buf[offset] & 0x3f);
  1305. offset += 1;
  1306. ret = 0;
  1307. }
  1308. else if ((buf[offset] & 0xc0) == 0x80)
  1309. {
  1310. if ((offset + 2) > len)
  1311. {
  1312. *value = 0;
  1313. offset = len;
  1314. ret = -1;
  1315. }
  1316. else
  1317. {
  1318. *value = bfd_getb16 (buf + offset) & 0x3fff;
  1319. offset += 2;
  1320. ret = 0;
  1321. }
  1322. }
  1323. else
  1324. abort ();
  1325. if (offsetptr != NULL)
  1326. *offsetptr = offset;
  1327. return ret;
  1328. }
  1329. void
  1330. bfd_sym_print_type_information (bfd *abfd,
  1331. FILE *f,
  1332. unsigned char *buf,
  1333. unsigned long len,
  1334. unsigned long offset,
  1335. unsigned long *offsetptr)
  1336. {
  1337. unsigned int type;
  1338. if (offset >= len)
  1339. {
  1340. fprintf (f, "[NULL]");
  1341. if (offsetptr != NULL)
  1342. *offsetptr = offset;
  1343. return;
  1344. }
  1345. type = buf[offset];
  1346. offset++;
  1347. if (! (type & 0x80))
  1348. {
  1349. fprintf (f, "[%s] (0x%x)", bfd_sym_type_basic_name (type & 0x7f), type);
  1350. if (offsetptr != NULL)
  1351. *offsetptr = offset;
  1352. return;
  1353. }
  1354. if (type & 0x40)
  1355. fprintf (f, "[packed ");
  1356. else
  1357. fprintf (f, "[");
  1358. switch (type & 0x3f)
  1359. {
  1360. case 1:
  1361. {
  1362. long value;
  1363. bfd_sym_type_information_table_entry tinfo;
  1364. bfd_sym_fetch_long (buf, len, offset, &offset, &value);
  1365. if (value <= 0)
  1366. fprintf (f, "[INVALID]");
  1367. else
  1368. {
  1369. if (bfd_sym_fetch_type_table_information (abfd, &tinfo, value) < 0)
  1370. fprintf (f, "[INVALID]");
  1371. else
  1372. fprintf (f, "\"%.*s\"",
  1373. bfd_sym_symbol_name (abfd, tinfo.nte_index)[0],
  1374. &bfd_sym_symbol_name (abfd, tinfo.nte_index)[1]);
  1375. }
  1376. fprintf (f, " (TTE %lu)", (unsigned long) value);
  1377. break;
  1378. }
  1379. case 2:
  1380. fprintf (f, "pointer (0x%x) to ", type);
  1381. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1382. break;
  1383. case 3:
  1384. {
  1385. long value;
  1386. fprintf (f, "scalar (0x%x) of ", type);
  1387. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1388. bfd_sym_fetch_long (buf, len, offset, &offset, &value);
  1389. fprintf (f, " (%lu)", (unsigned long) value);
  1390. break;
  1391. }
  1392. case 5:
  1393. {
  1394. long lower, upper, nelem;
  1395. int i;
  1396. fprintf (f, "enumeration (0x%x) of ", type);
  1397. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1398. bfd_sym_fetch_long (buf, len, offset, &offset, &lower);
  1399. bfd_sym_fetch_long (buf, len, offset, &offset, &upper);
  1400. bfd_sym_fetch_long (buf, len, offset, &offset, &nelem);
  1401. fprintf (f, " from %lu to %lu with %lu elements: ",
  1402. (unsigned long) lower, (unsigned long) upper,
  1403. (unsigned long) nelem);
  1404. for (i = 0; i < nelem; i++)
  1405. {
  1406. fprintf (f, "\n ");
  1407. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1408. }
  1409. break;
  1410. }
  1411. case 6:
  1412. fprintf (f, "vector (0x%x)", type);
  1413. fprintf (f, "\n index ");
  1414. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1415. fprintf (f, "\n target ");
  1416. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1417. break;
  1418. case 7:
  1419. case 8:
  1420. {
  1421. long nrec, eloff, i;
  1422. if ((type & 0x3f) == 7)
  1423. fprintf (f, "record (0x%x) of ", type);
  1424. else
  1425. fprintf (f, "union (0x%x) of ", type);
  1426. bfd_sym_fetch_long (buf, len, offset, &offset, &nrec);
  1427. fprintf (f, "%lu elements: ", (unsigned long) nrec);
  1428. for (i = 0; i < nrec; i++)
  1429. {
  1430. bfd_sym_fetch_long (buf, len, offset, &offset, &eloff);
  1431. fprintf (f, "\n ");
  1432. fprintf (f, "offset %lu: ", (unsigned long) eloff);
  1433. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1434. }
  1435. break;
  1436. }
  1437. case 9:
  1438. fprintf (f, "subrange (0x%x) of ", type);
  1439. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1440. fprintf (f, " lower ");
  1441. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1442. fprintf (f, " upper ");
  1443. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1444. break;
  1445. case 11:
  1446. {
  1447. long value;
  1448. fprintf (f, "named type (0x%x) ", type);
  1449. bfd_sym_fetch_long (buf, len, offset, &offset, &value);
  1450. if (value <= 0)
  1451. fprintf (f, "[INVALID]");
  1452. else
  1453. fprintf (f, "\"%.*s\"",
  1454. bfd_sym_symbol_name (abfd, value)[0],
  1455. &bfd_sym_symbol_name (abfd, value)[1]);
  1456. fprintf (f, " (NTE %lu) with type ", (unsigned long) value);
  1457. bfd_sym_print_type_information (abfd, f, buf, len, offset, &offset);
  1458. break;
  1459. }
  1460. default:
  1461. fprintf (f, "%s (0x%x)", bfd_sym_type_operator_name (type), type);
  1462. break;
  1463. }
  1464. if (type == (0x40 | 0x6))
  1465. {
  1466. /* Vector. */
  1467. long n, width, m;
  1468. long l;
  1469. long i;
  1470. bfd_sym_fetch_long (buf, len, offset, &offset, &n);
  1471. bfd_sym_fetch_long (buf, len, offset, &offset, &width);
  1472. bfd_sym_fetch_long (buf, len, offset, &offset, &m);
  1473. /* fprintf (f, "\n "); */
  1474. fprintf (f, " N %ld, width %ld, M %ld, ", n, width, m);
  1475. for (i = 0; i < m; i++)
  1476. {
  1477. bfd_sym_fetch_long (buf, len, offset, &offset, &l);
  1478. if (i != 0)
  1479. fprintf (f, " ");
  1480. fprintf (f, "%ld", l);
  1481. }
  1482. }
  1483. else if (type & 0x40)
  1484. {
  1485. /* Other packed type. */
  1486. long msb, lsb;
  1487. bfd_sym_fetch_long (buf, len, offset, &offset, &msb);
  1488. bfd_sym_fetch_long (buf, len, offset, &offset, &lsb);
  1489. /* fprintf (f, "\n "); */
  1490. fprintf (f, " msb %ld, lsb %ld", msb, lsb);
  1491. }
  1492. fprintf (f, "]");
  1493. if (offsetptr != NULL)
  1494. *offsetptr = offset;
  1495. }
  1496. void
  1497. bfd_sym_print_type_information_table_entry (bfd *abfd,
  1498. FILE *f,
  1499. bfd_sym_type_information_table_entry *entry)
  1500. {
  1501. unsigned char *buf;
  1502. unsigned long offset;
  1503. unsigned int i;
  1504. fprintf (f, "\"%.*s\" (NTE %lu), %lu bytes at %lu, logical size %lu",
  1505. bfd_sym_symbol_name (abfd, entry->nte_index)[0],
  1506. &bfd_sym_symbol_name (abfd, entry->nte_index)[1],
  1507. entry->nte_index,
  1508. entry->physical_size, entry->offset, entry->logical_size);
  1509. fprintf (f, "\n ");
  1510. if (bfd_seek (abfd, entry->offset, SEEK_SET) != 0
  1511. || (buf = _bfd_malloc_and_read (abfd, entry->physical_size,
  1512. entry->physical_size)) == NULL)
  1513. {
  1514. fprintf (f, "[ERROR]\n");
  1515. return;
  1516. }
  1517. fprintf (f, "[");
  1518. for (i = 0; i < entry->physical_size; i++)
  1519. {
  1520. if (i == 0)
  1521. fprintf (f, "0x%02x", buf[i]);
  1522. else
  1523. fprintf (f, " 0x%02x", buf[i]);
  1524. }
  1525. fprintf (f, "]");
  1526. fprintf (f, "\n ");
  1527. bfd_sym_print_type_information (abfd, f, buf, entry->physical_size, 0, &offset);
  1528. if (offset != entry->physical_size)
  1529. fprintf (f, "\n [parser used %lu bytes instead of %lu]", offset, entry->physical_size);
  1530. free (buf);
  1531. }
  1532. void
  1533. bfd_sym_print_file_references_index_table_entry (bfd *abfd ATTRIBUTE_UNUSED,
  1534. FILE *f,
  1535. bfd_sym_file_references_index_table_entry *entry ATTRIBUTE_UNUSED)
  1536. {
  1537. fprintf (f, "[UNIMPLEMENTED]");
  1538. }
  1539. void
  1540. bfd_sym_print_constant_pool_entry (bfd *abfd ATTRIBUTE_UNUSED,
  1541. FILE *f,
  1542. bfd_sym_constant_pool_entry *entry ATTRIBUTE_UNUSED)
  1543. {
  1544. fprintf (f, "[UNIMPLEMENTED]");
  1545. }
  1546. unsigned char *
  1547. bfd_sym_display_name_table_entry (bfd *abfd,
  1548. FILE *f,
  1549. unsigned char *entry)
  1550. {
  1551. unsigned long sym_index;
  1552. unsigned long offset;
  1553. bfd_sym_data_struct *sdata = NULL;
  1554. BFD_ASSERT (bfd_sym_valid (abfd));
  1555. sdata = abfd->tdata.sym_data;
  1556. sym_index = (entry - sdata->name_table) / 2;
  1557. if (sdata->version >= BFD_SYM_VERSION_3_4 && entry[0] == 255 && entry[1] == 0)
  1558. {
  1559. unsigned short length = bfd_getb16 (entry + 2);
  1560. fprintf (f, "[%8lu] \"%.*s\"\n", sym_index, length, entry + 4);
  1561. offset = 2 + length + 1;
  1562. }
  1563. else
  1564. {
  1565. if (! (entry[0] == 0 || (entry[0] == 1 && entry[1] == '\0')))
  1566. fprintf (f, "[%8lu] \"%.*s\"\n", sym_index, entry[0], entry + 1);
  1567. if (sdata->version >= BFD_SYM_VERSION_3_4)
  1568. offset = entry[0] + 2;
  1569. else
  1570. offset = entry[0] + 1;
  1571. }
  1572. return (entry + offset + (offset % 2));
  1573. }
  1574. void
  1575. bfd_sym_display_name_table (bfd *abfd, FILE *f)
  1576. {
  1577. unsigned long name_table_len;
  1578. unsigned char *name_table, *name_table_end, *cur;
  1579. bfd_sym_data_struct *sdata = NULL;
  1580. BFD_ASSERT (bfd_sym_valid (abfd));
  1581. sdata = abfd->tdata.sym_data;
  1582. name_table_len = sdata->header.dshb_nte.dti_page_count * sdata->header.dshb_page_size;
  1583. name_table = sdata->name_table;
  1584. name_table_end = name_table + name_table_len;
  1585. fprintf (f, "name table (NTE) contains %lu bytes:\n\n", name_table_len);
  1586. cur = name_table;
  1587. for (;;)
  1588. {
  1589. cur = bfd_sym_display_name_table_entry (abfd, f, cur);
  1590. if (cur >= name_table_end)
  1591. break;
  1592. }
  1593. }
  1594. void
  1595. bfd_sym_display_resources_table (bfd *abfd, FILE *f)
  1596. {
  1597. unsigned long i;
  1598. bfd_sym_resources_table_entry entry;
  1599. bfd_sym_data_struct *sdata = NULL;
  1600. BFD_ASSERT (bfd_sym_valid (abfd));
  1601. sdata = abfd->tdata.sym_data;
  1602. fprintf (f, "resource table (RTE) contains %lu objects:\n\n",
  1603. sdata->header.dshb_rte.dti_object_count);
  1604. for (i = 1; i <= sdata->header.dshb_rte.dti_object_count; i++)
  1605. {
  1606. if (bfd_sym_fetch_resources_table_entry (abfd, &entry, i) < 0)
  1607. fprintf (f, " [%8lu] [INVALID]\n", i);
  1608. else
  1609. {
  1610. fprintf (f, " [%8lu] ", i);
  1611. bfd_sym_print_resources_table_entry (abfd, f, &entry);
  1612. fprintf (f, "\n");
  1613. }
  1614. }
  1615. }
  1616. void
  1617. bfd_sym_display_modules_table (bfd *abfd, FILE *f)
  1618. {
  1619. unsigned long i;
  1620. bfd_sym_modules_table_entry entry;
  1621. bfd_sym_data_struct *sdata = NULL;
  1622. BFD_ASSERT (bfd_sym_valid (abfd));
  1623. sdata = abfd->tdata.sym_data;
  1624. fprintf (f, "module table (MTE) contains %lu objects:\n\n",
  1625. sdata->header.dshb_mte.dti_object_count);
  1626. for (i = 1; i <= sdata->header.dshb_mte.dti_object_count; i++)
  1627. {
  1628. if (bfd_sym_fetch_modules_table_entry (abfd, &entry, i) < 0)
  1629. fprintf (f, " [%8lu] [INVALID]\n", i);
  1630. else
  1631. {
  1632. fprintf (f, " [%8lu] ", i);
  1633. bfd_sym_print_modules_table_entry (abfd, f, &entry);
  1634. fprintf (f, "\n");
  1635. }
  1636. }
  1637. }
  1638. void
  1639. bfd_sym_display_file_references_table (bfd *abfd, FILE *f)
  1640. {
  1641. unsigned long i;
  1642. bfd_sym_file_references_table_entry entry;
  1643. bfd_sym_data_struct *sdata = NULL;
  1644. BFD_ASSERT (bfd_sym_valid (abfd));
  1645. sdata = abfd->tdata.sym_data;
  1646. fprintf (f, "file reference table (FRTE) contains %lu objects:\n\n",
  1647. sdata->header.dshb_frte.dti_object_count);
  1648. for (i = 1; i <= sdata->header.dshb_frte.dti_object_count; i++)
  1649. {
  1650. if (bfd_sym_fetch_file_references_table_entry (abfd, &entry, i) < 0)
  1651. fprintf (f, " [%8lu] [INVALID]\n", i);
  1652. else
  1653. {
  1654. fprintf (f, " [%8lu] ", i);
  1655. bfd_sym_print_file_references_table_entry (abfd, f, &entry);
  1656. fprintf (f, "\n");
  1657. }
  1658. }
  1659. }
  1660. void
  1661. bfd_sym_display_contained_modules_table (bfd *abfd, FILE *f)
  1662. {
  1663. unsigned long i;
  1664. bfd_sym_contained_modules_table_entry entry;
  1665. bfd_sym_data_struct *sdata = NULL;
  1666. BFD_ASSERT (bfd_sym_valid (abfd));
  1667. sdata = abfd->tdata.sym_data;
  1668. fprintf (f, "contained modules table (CMTE) contains %lu objects:\n\n",
  1669. sdata->header.dshb_cmte.dti_object_count);
  1670. for (i = 1; i <= sdata->header.dshb_cmte.dti_object_count; i++)
  1671. {
  1672. if (bfd_sym_fetch_contained_modules_table_entry (abfd, &entry, i) < 0)
  1673. fprintf (f, " [%8lu] [INVALID]\n", i);
  1674. else
  1675. {
  1676. fprintf (f, " [%8lu] ", i);
  1677. bfd_sym_print_contained_modules_table_entry (abfd, f, &entry);
  1678. fprintf (f, "\n");
  1679. }
  1680. }
  1681. }
  1682. void
  1683. bfd_sym_display_contained_variables_table (bfd *abfd, FILE *f)
  1684. {
  1685. unsigned long i;
  1686. bfd_sym_contained_variables_table_entry entry;
  1687. bfd_sym_data_struct *sdata = NULL;
  1688. BFD_ASSERT (bfd_sym_valid (abfd));
  1689. sdata = abfd->tdata.sym_data;
  1690. fprintf (f, "contained variables table (CVTE) contains %lu objects:\n\n",
  1691. sdata->header.dshb_cvte.dti_object_count);
  1692. for (i = 1; i <= sdata->header.dshb_cvte.dti_object_count; i++)
  1693. {
  1694. if (bfd_sym_fetch_contained_variables_table_entry (abfd, &entry, i) < 0)
  1695. fprintf (f, " [%8lu] [INVALID]\n", i);
  1696. else
  1697. {
  1698. fprintf (f, " [%8lu] ", i);
  1699. bfd_sym_print_contained_variables_table_entry (abfd, f, &entry);
  1700. fprintf (f, "\n");
  1701. }
  1702. }
  1703. fprintf (f, "\n");
  1704. }
  1705. void
  1706. bfd_sym_display_contained_statements_table (bfd *abfd, FILE *f)
  1707. {
  1708. unsigned long i;
  1709. bfd_sym_contained_statements_table_entry entry;
  1710. bfd_sym_data_struct *sdata = NULL;
  1711. BFD_ASSERT (bfd_sym_valid (abfd));
  1712. sdata = abfd->tdata.sym_data;
  1713. fprintf (f, "contained statements table (CSNTE) contains %lu objects:\n\n",
  1714. sdata->header.dshb_csnte.dti_object_count);
  1715. for (i = 1; i <= sdata->header.dshb_csnte.dti_object_count; i++)
  1716. {
  1717. if (bfd_sym_fetch_contained_statements_table_entry (abfd, &entry, i) < 0)
  1718. fprintf (f, " [%8lu] [INVALID]\n", i);
  1719. else
  1720. {
  1721. fprintf (f, " [%8lu] ", i);
  1722. bfd_sym_print_contained_statements_table_entry (abfd, f, &entry);
  1723. fprintf (f, "\n");
  1724. }
  1725. }
  1726. }
  1727. void
  1728. bfd_sym_display_contained_labels_table (bfd *abfd, FILE *f)
  1729. {
  1730. unsigned long i;
  1731. bfd_sym_contained_labels_table_entry entry;
  1732. bfd_sym_data_struct *sdata = NULL;
  1733. BFD_ASSERT (bfd_sym_valid (abfd));
  1734. sdata = abfd->tdata.sym_data;
  1735. fprintf (f, "contained labels table (CLTE) contains %lu objects:\n\n",
  1736. sdata->header.dshb_clte.dti_object_count);
  1737. for (i = 1; i <= sdata->header.dshb_clte.dti_object_count; i++)
  1738. {
  1739. if (bfd_sym_fetch_contained_labels_table_entry (abfd, &entry, i) < 0)
  1740. fprintf (f, " [%8lu] [INVALID]\n", i);
  1741. else
  1742. {
  1743. fprintf (f, " [%8lu] ", i);
  1744. bfd_sym_print_contained_labels_table_entry (abfd, f, &entry);
  1745. fprintf (f, "\n");
  1746. }
  1747. }
  1748. }
  1749. void
  1750. bfd_sym_display_contained_types_table (bfd *abfd, FILE *f)
  1751. {
  1752. unsigned long i;
  1753. bfd_sym_contained_types_table_entry entry;
  1754. bfd_sym_data_struct *sdata = NULL;
  1755. BFD_ASSERT (bfd_sym_valid (abfd));
  1756. sdata = abfd->tdata.sym_data;
  1757. fprintf (f, "contained types table (CTTE) contains %lu objects:\n\n",
  1758. sdata->header.dshb_ctte.dti_object_count);
  1759. for (i = 1; i <= sdata->header.dshb_ctte.dti_object_count; i++)
  1760. {
  1761. if (bfd_sym_fetch_contained_types_table_entry (abfd, &entry, i) < 0)
  1762. fprintf (f, " [%8lu] [INVALID]\n", i);
  1763. else
  1764. {
  1765. fprintf (f, " [%8lu] ", i);
  1766. bfd_sym_print_contained_types_table_entry (abfd, f, &entry);
  1767. fprintf (f, "\n");
  1768. }
  1769. }
  1770. }
  1771. void
  1772. bfd_sym_display_file_references_index_table (bfd *abfd, FILE *f)
  1773. {
  1774. unsigned long i;
  1775. bfd_sym_file_references_index_table_entry entry;
  1776. bfd_sym_data_struct *sdata = NULL;
  1777. BFD_ASSERT (bfd_sym_valid (abfd));
  1778. sdata = abfd->tdata.sym_data;
  1779. fprintf (f, "file references index table (FITE) contains %lu objects:\n\n",
  1780. sdata->header.dshb_fite.dti_object_count);
  1781. for (i = 1; i <= sdata->header.dshb_fite.dti_object_count; i++)
  1782. {
  1783. if (bfd_sym_fetch_file_references_index_table_entry (abfd, &entry, i) < 0)
  1784. fprintf (f, " [%8lu] [INVALID]\n", i);
  1785. else
  1786. {
  1787. fprintf (f, " [%8lu] ", i);
  1788. bfd_sym_print_file_references_index_table_entry (abfd, f, &entry);
  1789. fprintf (f, "\n");
  1790. }
  1791. }
  1792. }
  1793. void
  1794. bfd_sym_display_constant_pool (bfd *abfd, FILE *f)
  1795. {
  1796. unsigned long i;
  1797. bfd_sym_constant_pool_entry entry;
  1798. bfd_sym_data_struct *sdata = NULL;
  1799. BFD_ASSERT (bfd_sym_valid (abfd));
  1800. sdata = abfd->tdata.sym_data;
  1801. fprintf (f, "constant pool (CONST) contains %lu objects:\n\n",
  1802. sdata->header.dshb_const.dti_object_count);
  1803. for (i = 1; i <= sdata->header.dshb_const.dti_object_count; i++)
  1804. {
  1805. if (bfd_sym_fetch_constant_pool_entry (abfd, &entry, i) < 0)
  1806. fprintf (f, " [%8lu] [INVALID]\n", i);
  1807. else
  1808. {
  1809. fprintf (f, " [%8lu] ", i);
  1810. bfd_sym_print_constant_pool_entry (abfd, f, &entry);
  1811. fprintf (f, "\n");
  1812. }
  1813. }
  1814. }
  1815. void
  1816. bfd_sym_display_type_information_table (bfd *abfd, FILE *f)
  1817. {
  1818. unsigned long i;
  1819. bfd_sym_type_table_entry sym_index;
  1820. bfd_sym_type_information_table_entry entry;
  1821. bfd_sym_data_struct *sdata = NULL;
  1822. BFD_ASSERT (bfd_sym_valid (abfd));
  1823. sdata = abfd->tdata.sym_data;
  1824. if (sdata->header.dshb_tte.dti_object_count > 99)
  1825. fprintf (f, "type table (TINFO) contains %lu objects:\n\n",
  1826. sdata->header.dshb_tte.dti_object_count - 99);
  1827. else
  1828. {
  1829. fprintf (f, "type table (TINFO) contains [INVALID] objects:\n\n");
  1830. return;
  1831. }
  1832. for (i = 100; i <= sdata->header.dshb_tte.dti_object_count; i++)
  1833. {
  1834. if (bfd_sym_fetch_type_table_entry (abfd, &sym_index, i - 100) < 0)
  1835. fprintf (f, " [%8lu] [INVALID]\n", i);
  1836. else
  1837. {
  1838. fprintf (f, " [%8lu] (TINFO %lu) ", i, sym_index);
  1839. if (bfd_sym_fetch_type_information_table_entry (abfd, &entry, sym_index) < 0)
  1840. fprintf (f, "[INVALID]");
  1841. else
  1842. bfd_sym_print_type_information_table_entry (abfd, f, &entry);
  1843. fprintf (f, "\n");
  1844. }
  1845. }
  1846. }
  1847. int
  1848. bfd_sym_scan (bfd *abfd, bfd_sym_version version, bfd_sym_data_struct *mdata)
  1849. {
  1850. asection *bfdsec;
  1851. const char *name = "symbols";
  1852. mdata->name_table = 0;
  1853. mdata->sbfd = abfd;
  1854. mdata->version = version;
  1855. bfd_seek (abfd, 0, SEEK_SET);
  1856. if (bfd_sym_read_header (abfd, &mdata->header, mdata->version) != 0)
  1857. return -1;
  1858. mdata->name_table = bfd_sym_read_name_table (abfd, &mdata->header);
  1859. if (mdata->name_table == NULL)
  1860. return -1;
  1861. bfdsec = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
  1862. if (bfdsec == NULL)
  1863. return -1;
  1864. bfdsec->vma = 0;
  1865. bfdsec->lma = 0;
  1866. bfdsec->size = 0;
  1867. bfdsec->filepos = 0;
  1868. bfdsec->alignment_power = 0;
  1869. abfd->tdata.sym_data = mdata;
  1870. return 0;
  1871. }
  1872. bfd_cleanup
  1873. bfd_sym_object_p (bfd *abfd)
  1874. {
  1875. bfd_sym_version version = -1;
  1876. bfd_sym_data_struct *mdata;
  1877. bfd_seek (abfd, 0, SEEK_SET);
  1878. if (bfd_sym_read_version (abfd, &version) != 0)
  1879. goto wrong;
  1880. mdata = (bfd_sym_data_struct *) bfd_alloc (abfd, sizeof (*mdata));
  1881. if (mdata == NULL)
  1882. goto fail;
  1883. if (bfd_sym_scan (abfd, version, mdata) != 0)
  1884. goto wrong;
  1885. return _bfd_no_cleanup;
  1886. wrong:
  1887. bfd_set_error (bfd_error_wrong_format);
  1888. fail:
  1889. return NULL;
  1890. }
  1891. #define bfd_sym_make_empty_symbol _bfd_generic_make_empty_symbol
  1892. void
  1893. bfd_sym_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED, asymbol *symbol, symbol_info *ret)
  1894. {
  1895. bfd_symbol_info (symbol, ret);
  1896. }
  1897. long
  1898. bfd_sym_get_symtab_upper_bound (bfd *abfd ATTRIBUTE_UNUSED)
  1899. {
  1900. return 0;
  1901. }
  1902. long
  1903. bfd_sym_canonicalize_symtab (bfd *abfd ATTRIBUTE_UNUSED, asymbol **sym ATTRIBUTE_UNUSED)
  1904. {
  1905. return 0;
  1906. }
  1907. int
  1908. bfd_sym_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
  1909. struct bfd_link_info *info ATTRIBUTE_UNUSED)
  1910. {
  1911. return 0;
  1912. }
  1913. const bfd_target sym_vec =
  1914. {
  1915. "sym", /* Name. */
  1916. bfd_target_sym_flavour, /* Flavour. */
  1917. BFD_ENDIAN_BIG, /* Byteorder. */
  1918. BFD_ENDIAN_BIG, /* Header byteorder. */
  1919. (HAS_RELOC | EXEC_P | /* Object flags. */
  1920. HAS_LINENO | HAS_DEBUG |
  1921. HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
  1922. (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_DATA
  1923. | SEC_ROM | SEC_HAS_CONTENTS), /* Section_flags. */
  1924. 0, /* Symbol_leading_char. */
  1925. ' ', /* AR_pad_char. */
  1926. 16, /* AR_max_namelen. */
  1927. 0, /* match priority. */
  1928. TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols. */
  1929. bfd_getb64, bfd_getb_signed_64, bfd_putb64,
  1930. bfd_getb32, bfd_getb_signed_32, bfd_putb32,
  1931. bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Data. */
  1932. bfd_getb64, bfd_getb_signed_64, bfd_putb64,
  1933. bfd_getb32, bfd_getb_signed_32, bfd_putb32,
  1934. bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Hdrs. */
  1935. { /* bfd_check_format. */
  1936. _bfd_dummy_target,
  1937. bfd_sym_object_p, /* bfd_check_format. */
  1938. _bfd_dummy_target,
  1939. _bfd_dummy_target,
  1940. },
  1941. { /* bfd_set_format. */
  1942. _bfd_bool_bfd_false_error,
  1943. bfd_sym_mkobject,
  1944. _bfd_bool_bfd_false_error,
  1945. _bfd_bool_bfd_false_error,
  1946. },
  1947. { /* bfd_write_contents. */
  1948. _bfd_bool_bfd_false_error,
  1949. _bfd_bool_bfd_true,
  1950. _bfd_bool_bfd_false_error,
  1951. _bfd_bool_bfd_false_error,
  1952. },
  1953. BFD_JUMP_TABLE_GENERIC (bfd_sym),
  1954. BFD_JUMP_TABLE_COPY (_bfd_generic),
  1955. BFD_JUMP_TABLE_CORE (_bfd_nocore),
  1956. BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
  1957. BFD_JUMP_TABLE_SYMBOLS (bfd_sym),
  1958. BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
  1959. BFD_JUMP_TABLE_WRITE (bfd_sym),
  1960. BFD_JUMP_TABLE_LINK (bfd_sym),
  1961. BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
  1962. NULL,
  1963. NULL
  1964. };