Skip to content

Commit cc6ab26

Browse files
[lldb][ObjectFileELF] Improve error output for unsupported arch/relocations
ObjectFileELF::ApplyRelocations() considered all 32-bit input objects to be i386 and didn't provide good error messages for AArch32 objects. Please find an example in #61948 While we are here, let' improve the situation for unsupported architectures as well. I think we should report the error here too and not silently fail (or crash with assertions enabled). Reviewed By: SixWeining Differential Revision: https://reviews.llvm.org/D147627
1 parent df3f1e2 commit cc6ab26

File tree

1 file changed

+39
-27
lines changed

1 file changed

+39
-27
lines changed

lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2666,38 +2666,49 @@ unsigned ObjectFileELF::ApplyRelocations(
26662666
Symbol *symbol = nullptr;
26672667

26682668
if (hdr->Is32Bit()) {
2669-
switch (reloc_type(rel)) {
2670-
case R_386_32:
2671-
symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2672-
if (symbol) {
2673-
addr_t f_offset =
2674-
rel_section->GetFileOffset() + ELFRelocation::RelocOffset32(rel);
2675-
DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2676-
// ObjectFileELF creates a WritableDataBuffer in CreateInstance.
2677-
WritableDataBuffer *data_buffer =
2678-
llvm::cast<WritableDataBuffer>(data_buffer_sp.get());
2679-
uint32_t *dst = reinterpret_cast<uint32_t *>(
2680-
data_buffer->GetBytes() + f_offset);
2681-
2682-
addr_t value = symbol->GetAddressRef().GetFileAddress();
2683-
if (rel.IsRela()) {
2684-
value += ELFRelocation::RelocAddend32(rel);
2669+
switch (hdr->e_machine) {
2670+
case llvm::ELF::EM_386:
2671+
switch (reloc_type(rel)) {
2672+
case R_386_32:
2673+
symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2674+
if (symbol) {
2675+
addr_t f_offset =
2676+
rel_section->GetFileOffset() + ELFRelocation::RelocOffset32(rel);
2677+
DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2678+
// ObjectFileELF creates a WritableDataBuffer in CreateInstance.
2679+
WritableDataBuffer *data_buffer =
2680+
llvm::cast<WritableDataBuffer>(data_buffer_sp.get());
2681+
uint32_t *dst = reinterpret_cast<uint32_t *>(
2682+
data_buffer->GetBytes() + f_offset);
2683+
2684+
addr_t value = symbol->GetAddressRef().GetFileAddress();
2685+
if (rel.IsRela()) {
2686+
value += ELFRelocation::RelocAddend32(rel);
2687+
} else {
2688+
value += *dst;
2689+
}
2690+
*dst = value;
26852691
} else {
2686-
value += *dst;
2692+
GetModule()->ReportError(".rel{0}[{1}] unknown symbol id: {2:d}",
2693+
rel_section->GetName().AsCString(), i,
2694+
reloc_symbol(rel));
26872695
}
2688-
*dst = value;
2689-
} else {
2690-
GetModule()->ReportError(".rel{0}[{1}] unknown symbol id: {2:d}",
2696+
break;
2697+
case R_386_NONE:
2698+
case R_386_PC32:
2699+
GetModule()->ReportError("unsupported i386 relocation:"
2700+
" .rel{0}[{1}], type {2}",
26912701
rel_section->GetName().AsCString(), i,
2692-
reloc_symbol(rel));
2702+
reloc_type(rel));
2703+
break;
2704+
default:
2705+
assert(false && "unexpected relocation type");
2706+
break;
26932707
}
26942708
break;
2695-
case R_386_PC32:
26962709
default:
2697-
GetModule()->ReportError("unsupported 32-bit relocation:"
2698-
" .rel{0}[{1}], type {2}",
2699-
rel_section->GetName().AsCString(), i,
2700-
reloc_type(rel));
2710+
GetModule()->ReportError("unsupported 32-bit ELF machine arch: {0}", hdr->e_machine);
2711+
break;
27012712
}
27022713
} else {
27032714
switch (hdr->e_machine) {
@@ -2743,7 +2754,8 @@ unsigned ObjectFileELF::ApplyRelocations(
27432754
}
27442755
break;
27452756
default:
2746-
assert(false && "unsupported machine");
2757+
GetModule()->ReportError("unsupported 64-bit ELF machine arch: {0}", hdr->e_machine);
2758+
break;
27472759
}
27482760
}
27492761
}

0 commit comments

Comments
 (0)