mirror of
https://git.suyu.dev/suyu/breakpad.git
synced 2026-01-01 20:24:40 +01:00
issue 243 - Linux dumper should use build id produced by ld --build-id if available
R=thestig at http://breakpad.appspot.com/185001 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@830 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
68e380d5a7
commit
8ade75f955
5 changed files with 259 additions and 95 deletions
|
|
@ -3,10 +3,15 @@
|
|||
#include <assert.h>
|
||||
#include <elf.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
namespace google_breakpad {
|
||||
namespace synth_elf {
|
||||
|
||||
#ifndef NT_GNU_BUILD_ID
|
||||
#define NT_GNU_BUILD_ID 3
|
||||
#endif
|
||||
|
||||
ELF::ELF(uint16_t machine,
|
||||
uint8_t file_class,
|
||||
Endianness endianness)
|
||||
|
|
@ -169,6 +174,31 @@ void SymbolTable::AddSymbol(const string& name, uint64_t value,
|
|||
D64(size);
|
||||
}
|
||||
|
||||
BuildIDNote::BuildIDNote(const uint8_t* id_bytes,
|
||||
size_t id_size,
|
||||
Endianness endianness) : Section(endianness) {
|
||||
const char kNoteName[] = "GNU";
|
||||
// Elf32_Nhdr and Elf64_Nhdr are exactly the same.
|
||||
Elf32_Nhdr note_header;
|
||||
memset(¬e_header, 0, sizeof(note_header));
|
||||
note_header.n_namesz = sizeof(kNoteName);
|
||||
note_header.n_descsz = id_size;
|
||||
note_header.n_type = NT_GNU_BUILD_ID;
|
||||
|
||||
Append(reinterpret_cast<const uint8_t*>(¬e_header),
|
||||
sizeof(note_header));
|
||||
AppendCString(kNoteName);
|
||||
Append(id_bytes, id_size);
|
||||
}
|
||||
|
||||
// static
|
||||
void BuildIDNote::AppendSection(ELF& elf,
|
||||
const uint8_t* id_bytes,
|
||||
size_t id_size) {
|
||||
const char kBuildIDSectionName[] = ".note.gnu.build-id";
|
||||
BuildIDNote note(id_bytes, id_size, elf.endianness());
|
||||
elf.AddSection(kBuildIDSectionName, note, SHT_NOTE);
|
||||
}
|
||||
|
||||
} // namespace synth_elf
|
||||
} // namespace google_breakpad
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue