blob: 19455a597be6449c846675a03572297551b8069d [file] [log] [blame]
/* Pedantic checking of DWARF files
Copyright (C) 2009,2010,2011 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
elfutils is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "checks.hh"
#include "messages.hh"
#include "sections.hh"
#include "option.hh"
static void_option ignore_missing
("Don't complain if files have no DWARF at all",
"nodebug:ignore", 'i');
class check_nodebug
: public check<check_nodebug>
{
public:
static checkdescriptor const *descriptor ()
{
static checkdescriptor cd
(checkdescriptor::create ("check_nodebug")
.groups ("@low")
.option (ignore_missing)
.description (
"Checks that there are at least essential debuginfo sections present "
"in the ELF file.\n"));
return &cd;
}
check_nodebug (checkstack &stack, dwarflint &lint);
private:
void not_available (section_id sec_id)
{
wr_error (section_locus (sec_id))
<< "data not found." << std::endl;
}
template <section_id sec_id>
void request (checkstack &stack, dwarflint &lint)
{
if (lint.toplev_check<section<sec_id> > (stack) == NULL)
not_available (sec_id);
}
};
static reg<check_nodebug> reg_nodebug;
check_nodebug::check_nodebug (checkstack &stack, dwarflint &lint)
{
if (ignore_missing)
return;
// We demand .debug_info and .debug_abbrev, the rest is optional.
// Presence of the other sections is (or should be) requested if
// there are pending references from .debug_info.
request<sec_abbrev> (stack, lint);
request<sec_info> (stack, lint);
}