Blame dwarfdump/section_bitmaps.c

Packit cdaae3
/*
Packit cdaae3
  Copyright (C) 2017-2017 David Anderson. All Rights Reserved.
Packit cdaae3
Packit cdaae3
  This program is free software; you can redistribute it and/or modify it
Packit cdaae3
  under the terms of version 2 of the GNU General Public License as
Packit cdaae3
  published by the Free Software Foundation.
Packit cdaae3
Packit cdaae3
  This program is distributed in the hope that it would be useful, but
Packit cdaae3
  WITHOUT ANY WARRANTY; without even the implied warranty of
Packit cdaae3
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Packit cdaae3
Packit cdaae3
  Further, this software is distributed without any warranty that it is
Packit cdaae3
  free of the rightful claim of any third person regarding infringement
Packit cdaae3
  or the like.  Any license provided herein, whether implied or
Packit cdaae3
  otherwise, applies only to this software file.  Patent licenses, if
Packit cdaae3
  any, provided herein do not apply to combinations of this program with
Packit cdaae3
  other software, or any other product whatsoever.
Packit cdaae3
Packit cdaae3
  You should have received a copy of the GNU General Public License along
Packit cdaae3
  with this program; if not, write the Free Software Foundation, Inc., 51
Packit cdaae3
  Franklin Street - Fifth Floor, Boston MA 02110-1301, USA.
Packit cdaae3
*/
Packit cdaae3
Packit cdaae3
#include "globals.h"
Packit cdaae3
/*  section_bitmaps.h and .c actually involved  bits,
Packit cdaae3
    bit shifting, and bit masks,
Packit cdaae3
    but now the 'maps' are simple byte arrays.
Packit cdaae3
    See reloc_map and section_map in dwarfdump.c */
Packit cdaae3
Packit cdaae3
Packit cdaae3
#define TRUE  1
Packit cdaae3
#define FALSE 0
Packit cdaae3
Packit cdaae3
struct section_map_s
Packit cdaae3
map_sectnames[DW_HDR_ARRAY_SIZE] = {
Packit cdaae3
    {0,0},
Packit cdaae3
    {DW_SECTNAME_DEBUG_INFO,            DW_HDR_DEBUG_INFO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_INFO_DWO,        DW_HDR_DEBUG_INFO_DWO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_LINE,            DW_HDR_DEBUG_LINE},
Packit cdaae3
    {DW_SECTNAME_DEBUG_LINE_DWO,        DW_HDR_DEBUG_LINE_DWO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_PUBNAMES,        DW_HDR_DEBUG_PUBNAMES},
Packit cdaae3
    {DW_SECTNAME_DEBUG_ABBREV,          DW_HDR_DEBUG_ABBREV},
Packit cdaae3
    {DW_SECTNAME_DEBUG_ABBREV_DWO,      DW_HDR_DEBUG_ABBREV_DWO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_ARANGES,         DW_HDR_DEBUG_ARANGES},
Packit cdaae3
    {DW_SECTNAME_DEBUG_FRAME,           DW_HDR_DEBUG_FRAME},
Packit cdaae3
    {DW_SECTNAME_DEBUG_LOC,             DW_HDR_DEBUG_LOC},
Packit cdaae3
    {DW_SECTNAME_DEBUG_LOCLISTS,        DW_HDR_DEBUG_LOCLISTS},
Packit cdaae3
    {DW_SECTNAME_DEBUG_LOCLISTS_DWO,    DW_HDR_DEBUG_LOCLISTS_DWO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_RANGES,          DW_HDR_DEBUG_RANGES},
Packit cdaae3
    {DW_SECTNAME_DEBUG_RNGLISTS,        DW_HDR_DEBUG_RNGLISTS},
Packit cdaae3
    {DW_SECTNAME_DEBUG_RNGLISTS_DWO,    DW_HDR_DEBUG_RNGLISTS_DWO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_STR,             DW_HDR_DEBUG_STR},
Packit cdaae3
    {DW_SECTNAME_DEBUG_STR_DWO,         DW_HDR_DEBUG_STR_DWO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_STR_OFFSETS,     DW_HDR_DEBUG_STR_OFFSETS},
Packit cdaae3
    {DW_SECTNAME_DEBUG_STR_OFFSETS_DWO, DW_HDR_DEBUG_STR_OFFSETS_DWO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_PUBTYPES,        DW_HDR_DEBUG_PUBTYPES},
Packit cdaae3
    {DW_SECTNAME_DEBUG_TYPES,           DW_HDR_DEBUG_TYPES},
Packit cdaae3
    {DW_SECTNAME_TEXT,                  DW_HDR_TEXT},
Packit cdaae3
    {DW_SECTNAME_GDB_INDEX,             DW_HDR_GDB_INDEX},
Packit cdaae3
    {DW_SECTNAME_EH_FRAME,              DW_HDR_EH_FRAME},
Packit cdaae3
    {DW_SECTNAME_DEBUG_MACINFO,         DW_HDR_DEBUG_MACINFO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_MACRO,           DW_HDR_DEBUG_MACRO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_MACRO_DWO,       DW_HDR_DEBUG_MACRO_DWO},
Packit cdaae3
    {DW_SECTNAME_DEBUG_NAMES,           DW_HDR_DEBUG_NAMES},
Packit cdaae3
    {DW_SECTNAME_DEBUG_CU_INDEX,        DW_HDR_DEBUG_CU_INDEX},
Packit cdaae3
    {DW_SECTNAME_DEBUG_TU_INDEX,        DW_HDR_DEBUG_TU_INDEX},
Packit cdaae3
    {"Elf Header",                      DW_HDR_HEADER},
Packit cdaae3
};
Packit cdaae3
Packit cdaae3
static boolean all_sections_on;
Packit cdaae3
Packit cdaae3
boolean
Packit cdaae3
section_name_is_debug_and_wanted(const char *section_name,char *secmap)
Packit cdaae3
{
Packit cdaae3
    unsigned i = 1;
Packit cdaae3
    if (all_sections_on) {
Packit cdaae3
        return TRUE;
Packit cdaae3
    }
Packit cdaae3
    for ( ; i < DW_HDR_ARRAY_SIZE; ++i) {
Packit cdaae3
        if(!strcmp(section_name,map_sectnames[i].name) &&
Packit cdaae3
            secmap[map_sectnames[i].value]) {
Packit cdaae3
            return TRUE;
Packit cdaae3
        }
Packit cdaae3
    }
Packit cdaae3
    return FALSE;
Packit cdaae3
}
Packit cdaae3
Packit cdaae3
/* For now defaults matches all but .text. */
Packit cdaae3
void
Packit cdaae3
set_all_section_defaults(char *section_map)
Packit cdaae3
{
Packit cdaae3
    unsigned i = 1;
Packit cdaae3
    for ( ; i < DW_HDR_ARRAY_SIZE; ++i) {
Packit cdaae3
        section_map[i] = TRUE;
Packit cdaae3
    }
Packit cdaae3
}
Packit cdaae3
Packit cdaae3
void
Packit cdaae3
set_all_sections_on(char *section_map)
Packit cdaae3
{
Packit cdaae3
    unsigned i = 1;
Packit cdaae3
    all_sections_on = TRUE;
Packit cdaae3
    for ( ; i < DW_HDR_ARRAY_SIZE; ++i) {
Packit cdaae3
        section_map[i] = TRUE;
Packit cdaae3
    }
Packit cdaae3
}
Packit cdaae3
void set_all_reloc_sections_on(char *m)
Packit cdaae3
{
Packit cdaae3
    unsigned i = 1;
Packit cdaae3
    for ( ; i < DW_SECTION_REL_ARRAY_SIZE; ++i) {
Packit cdaae3
        m[i] = TRUE;
Packit cdaae3
    }
Packit cdaae3
}
Packit cdaae3
Packit cdaae3
boolean
Packit cdaae3
any_section_header_to_print(char *section_map)
Packit cdaae3
{
Packit cdaae3
    unsigned i = 1;
Packit cdaae3
    for ( ; i < DW_HDR_HEADER; ++i) {
Packit cdaae3
        if(section_map[i]) {
Packit cdaae3
            return TRUE;
Packit cdaae3
        }
Packit cdaae3
    }
Packit cdaae3
    return FALSE;
Packit cdaae3
}
Packit cdaae3
Packit cdaae3
#ifdef SELFTEST
Packit cdaae3
Packit cdaae3
int main()
Packit cdaae3
{
Packit cdaae3
    unsigned i = 1;
Packit cdaae3
Packit cdaae3
    unsigned arraycount = sizeof(map_sectnames)/
Packit cdaae3
        sizeof (struct section_map_s);;
Packit cdaae3
Packit cdaae3
    if (arraycount  !=  DW_HDR_ARRAY_SIZE) {
Packit cdaae3
        printf("FAIL map_sections.c sections array wrong size "
Packit cdaae3
            "%u vs %u\n",
Packit cdaae3
            arraycount,DW_HDR_ARRAY_SIZE);
Packit cdaae3
        exit(1);
Packit cdaae3
    }
Packit cdaae3
    for ( ; i < DW_HDR_ARRAY_SIZE; ++i) {
Packit cdaae3
Packit cdaae3
        struct section_map_s * mp = map_sectnames+i;
Packit cdaae3
        if (mp->value != i) {
Packit cdaae3
            printf("FAIL map_sections.c at entry %s we have "
Packit cdaae3
            "0x%x vs 0x%x"
Packit cdaae3
                " mismatch\n",
Packit cdaae3
                mp->name?mp->name:"
Packit cdaae3
                mp->value,
Packit cdaae3
                i);
Packit cdaae3
            exit(1);
Packit cdaae3
        }
Packit cdaae3
        if (!mp->name) {
Packit cdaae3
            printf("FAIL map_sections.c at entry %u we have no name!\n",i);
Packit cdaae3
            exit(1);
Packit cdaae3
        }
Packit cdaae3
    }
Packit cdaae3
    printf("PASS section maps\n");
Packit cdaae3
    return 0;
Packit cdaae3
}
Packit cdaae3
Packit cdaae3
Packit cdaae3
Packit cdaae3
Packit cdaae3
#endif /* SELFTEST */