Linux/Mac: Add option to omit the CFI section in dump_syms.

Review URL: http://breakpad.appspot.com/304001

git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@835 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
thestig@chromium.org
2011-09-14 01:02:55 +00:00
parent 912c99fc8e
commit 8d54c75092
10 changed files with 214 additions and 128 deletions

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2010 Google Inc.
// Copyright (c) 2011 Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
@@ -728,6 +728,7 @@ namespace google_breakpad {
bool WriteSymbolFileInternal(uint8_t* obj_file,
const std::string &obj_filename,
const std::string &debug_dir,
bool cfi,
std::ostream &sym_stream) {
ElfW(Ehdr) *elf_header = reinterpret_cast<ElfW(Ehdr) *>(obj_file);
@@ -803,7 +804,7 @@ bool WriteSymbolFileInternal(uint8_t* obj_file,
return false;
}
}
if (!module.Write(sym_stream))
if (!module.Write(sym_stream, cfi))
return false;
return true;
@@ -811,6 +812,7 @@ bool WriteSymbolFileInternal(uint8_t* obj_file,
bool WriteSymbolFile(const std::string &obj_file,
const std::string &debug_dir,
bool cfi,
std::ostream &sym_stream) {
MmapWrapper map_wrapper;
ElfW(Ehdr) *elf_header = NULL;
@@ -818,7 +820,7 @@ bool WriteSymbolFile(const std::string &obj_file,
return false;
return WriteSymbolFileInternal(reinterpret_cast<uint8_t*>(elf_header),
obj_file, debug_dir, sym_stream);
obj_file, debug_dir, cfi, sym_stream);
}
} // namespace google_breakpad

View File

@@ -1,6 +1,6 @@
// -*- mode: c++ -*-
// Copyright (c) 2010, Google Inc.
// Copyright (c) 2011, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
@@ -45,8 +45,10 @@ namespace google_breakpad {
// file format.
// If OBJ_FILE has been stripped but contains a .gnu_debuglink section,
// then look for the debug file in DEBUG_DIR.
// If CFI is set to false, then omit the CFI section.
bool WriteSymbolFile(const std::string &obj_file,
const std::string &debug_dir,
bool cfi,
std::ostream &sym_stream);
} // namespace google_breakpad

View File

@@ -47,6 +47,7 @@ namespace google_breakpad {
bool WriteSymbolFileInternal(uint8_t* obj_file,
const std::string &obj_filename,
const std::string &debug_dir,
bool cfi,
std::ostream &sym_stream);
}
@@ -62,7 +63,7 @@ using std::vector;
using ::testing::Test;
class DumpSymbols : public Test {
public:
public:
void GetElfContents(ELF& elf) {
string contents;
ASSERT_TRUE(elf.GetContents(&contents));
@@ -84,6 +85,7 @@ TEST_F(DumpSymbols, Invalid) {
EXPECT_FALSE(WriteSymbolFileInternal(reinterpret_cast<uint8_t*>(&header),
"foo",
"",
true,
s));
}
@@ -105,11 +107,11 @@ TEST_F(DumpSymbols, SimplePublic32) {
SHN_UNDEF + 1);
int index = elf.AddSection(".dynstr", table, SHT_STRTAB);
elf.AddSection(".dynsym", syms,
SHT_DYNSYM, // type
SHF_ALLOC, // flags
0, // addr
index, // link
sizeof(Elf32_Sym)); // entsize
SHT_DYNSYM, // type
SHF_ALLOC, // flags
0, // addr
index, // link
sizeof(Elf32_Sym)); // entsize
elf.Finish();
GetElfContents(elf);
@@ -118,6 +120,7 @@ TEST_F(DumpSymbols, SimplePublic32) {
ASSERT_TRUE(WriteSymbolFileInternal(elfdata,
"foo",
"",
true,
s));
EXPECT_EQ("MODULE Linux x86 000000000000000000000000000000000 foo\n"
"PUBLIC 1000 0 superfunc\n",
@@ -141,11 +144,11 @@ TEST_F(DumpSymbols, SimplePublic64) {
SHN_UNDEF + 1);
int index = elf.AddSection(".dynstr", table, SHT_STRTAB);
elf.AddSection(".dynsym", syms,
SHT_DYNSYM, // type
SHF_ALLOC, // flags
0, // addr
index, // link
sizeof(Elf64_Sym)); // entsize
SHT_DYNSYM, // type
SHF_ALLOC, // flags
0, // addr
index, // link
sizeof(Elf64_Sym)); // entsize
elf.Finish();
GetElfContents(elf);
@@ -154,6 +157,7 @@ TEST_F(DumpSymbols, SimplePublic64) {
ASSERT_TRUE(WriteSymbolFileInternal(elfdata,
"foo",
"",
true,
s));
EXPECT_EQ("MODULE Linux x86_64 000000000000000000000000000000000 foo\n"
"PUBLIC 1000 0 superfunc\n",