Home | History | Annotate | Line # | Download | only in libdwarf
      1 /*	$NetBSD: dwarf_sections.c,v 1.4 2024/03/03 17:37:32 christos Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2014 Kai Wang
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 
     29 #include "_libdwarf.h"
     30 
     31 __RCSID("$NetBSD: dwarf_sections.c,v 1.4 2024/03/03 17:37:32 christos Exp $");
     32 ELFTC_VCSID("Id: dwarf_sections.c 3902 2020-11-24 21:17:41Z jkoshy");
     33 
     34 #define	SET(N, V)				\
     35 	do {					\
     36 		if ((N) != NULL)		\
     37 			*(N) = (V);		\
     38 	} while (/* CONSTCOND */ 0)
     39 
     40 int
     41 dwarf_get_section_max_offsets_b(Dwarf_Debug dbg, Dwarf_Unsigned *debug_info,
     42     Dwarf_Unsigned *debug_abbrev, Dwarf_Unsigned *debug_line,
     43     Dwarf_Unsigned *debug_loc, Dwarf_Unsigned *debug_aranges,
     44     Dwarf_Unsigned *debug_macinfo, Dwarf_Unsigned *debug_pubnames,
     45     Dwarf_Unsigned *debug_str, Dwarf_Unsigned *debug_frame,
     46     Dwarf_Unsigned *debug_ranges, Dwarf_Unsigned *debug_pubtypes,
     47     Dwarf_Unsigned *debug_types)
     48 {
     49 	const char *n;
     50 	Dwarf_Unsigned sz;
     51 	int i;
     52 
     53 	if (dbg == NULL)
     54 		return (DW_DLV_ERROR);
     55 
     56 	SET(debug_info, 0);
     57 	SET(debug_abbrev, 0);
     58 	SET(debug_line, 0);
     59 	SET(debug_loc, 0);
     60 	SET(debug_aranges, 0);
     61 	SET(debug_macinfo, 0);
     62 	SET(debug_pubnames, 0);
     63 	SET(debug_str, 0);
     64 	SET(debug_frame, 0);
     65 	SET(debug_ranges, 0);
     66 	SET(debug_pubtypes, 0);
     67 	SET(debug_types, 0);
     68 
     69 	for (i = 0; (Dwarf_Unsigned) i < dbg->dbg_seccnt; i++) {
     70 		n = dbg->dbg_section[i].ds_name;
     71 		sz = dbg->dbg_section[i].ds_size;
     72 		if (!strcmp(n, ".debug_info"))
     73 			SET(debug_info, sz);
     74 		else if (!strcmp(n, ".debug_abbrev"))
     75 			SET(debug_abbrev, sz);
     76 		else if (!strcmp(n, ".debug_line"))
     77 			SET(debug_line, sz);
     78 		else if (!strcmp(n, ".debug_loc"))
     79 			SET(debug_loc, sz);
     80 		else if (!strcmp(n, ".debug_aranges"))
     81 			SET(debug_aranges, sz);
     82 		else if (!strcmp(n, ".debug_macinfo"))
     83 			SET(debug_macinfo, sz);
     84 		else if (!strcmp(n, ".debug_pubnames"))
     85 			SET(debug_pubnames, sz);
     86 		else if (!strcmp(n, ".debug_str"))
     87 			SET(debug_str, sz);
     88 		else if (!strcmp(n, ".debug_frame"))
     89 			SET(debug_frame, sz);
     90 		else if (!strcmp(n, ".debug_ranges"))
     91 			SET(debug_ranges, sz);
     92 		else if (!strcmp(n, ".debug_pubtypes"))
     93 			SET(debug_pubtypes, sz);
     94 		else if (!strcmp(n, ".debug_types"))
     95 			SET(debug_types, sz);
     96 	}
     97 
     98 	return (DW_DLV_OK);
     99 }
    100 
    101 int
    102 dwarf_get_section_max_offsets(Dwarf_Debug dbg, Dwarf_Unsigned *debug_info,
    103     Dwarf_Unsigned *debug_abbrev, Dwarf_Unsigned *debug_line,
    104     Dwarf_Unsigned *debug_loc, Dwarf_Unsigned *debug_aranges,
    105     Dwarf_Unsigned *debug_macinfo, Dwarf_Unsigned *debug_pubnames,
    106     Dwarf_Unsigned *debug_str, Dwarf_Unsigned *debug_frame,
    107     Dwarf_Unsigned *debug_ranges, Dwarf_Unsigned *debug_pubtypes)
    108 {
    109 
    110 	return (dwarf_get_section_max_offsets_b(dbg, debug_info, debug_abbrev,
    111 	    debug_line, debug_loc, debug_aranges, debug_macinfo,
    112 	    debug_pubnames, debug_str, debug_frame, debug_ranges,
    113 	    debug_pubtypes, NULL));
    114 }
    115