mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-24 06:10:12 +00:00
[WebAssembly][lld] Fix crash when applying relocations to debug sections
Debug sections are special in that they can contain relocations against symbols that are not present in the final output (i.e. not live). However it is also possible to have R_WASM_TABLE_INDEX relocations against symbols that don't have a table index assigned (since they are not address taken by actual code. Fixes: https://github.com/emscripten-core/emscripten/issues/9023 Differential Revision: https://reviews.llvm.org/D66435 llvm-svn: 369423
This commit is contained in:
parent
fc4486c247
commit
cf2b8722d4
23
lld/test/wasm/debuginfo-relocs.s
Normal file
23
lld/test/wasm/debuginfo-relocs.s
Normal file
@ -0,0 +1,23 @@
|
||||
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
|
||||
# RUN: wasm-ld %t.o -o %t.wasm
|
||||
# RUN: obj2yaml %t.wasm | FileCheck %s
|
||||
|
||||
bar:
|
||||
.functype bar () -> ()
|
||||
end_function
|
||||
|
||||
.globl _start
|
||||
_start:
|
||||
.functype _start () -> ()
|
||||
call bar
|
||||
end_function
|
||||
|
||||
.section .debug_info,"",@
|
||||
.int32 bar
|
||||
|
||||
# Even though `bar` is live in the final binary it doesn't have a table entry
|
||||
# since its not address taken in the code. In this case any relocations in the
|
||||
# debug sections see a address of zero.
|
||||
|
||||
# CHECK: Name: .debug_info
|
||||
# CHECK-NEXT: Payload: '00000000'
|
@ -100,7 +100,7 @@ void InputChunk::writeTo(uint8_t *buf) const {
|
||||
verifyRelocTargets();
|
||||
#endif
|
||||
|
||||
LLVM_DEBUG(dbgs() << "applying relocations: " << getName()
|
||||
LLVM_DEBUG(dbgs() << "applying relocations: " << toString(this)
|
||||
<< " count=" << relocations.size() << "\n");
|
||||
int32_t off = outputOffset - getInputSectionOffset();
|
||||
|
||||
|
@ -166,7 +166,7 @@ uint32_t ObjFile::calcNewValue(const WasmRelocation &reloc) const {
|
||||
case R_WASM_TABLE_INDEX_I32:
|
||||
case R_WASM_TABLE_INDEX_SLEB:
|
||||
case R_WASM_TABLE_INDEX_REL_SLEB:
|
||||
if (config->isPic && !getFunctionSymbol(reloc.Index)->hasTableIndex())
|
||||
if (!getFunctionSymbol(reloc.Index)->hasTableIndex())
|
||||
return 0;
|
||||
return getFunctionSymbol(reloc.Index)->getTableIndex();
|
||||
case R_WASM_MEMORY_ADDR_SLEB:
|
||||
|
@ -123,6 +123,7 @@ public:
|
||||
// See use of .init_array in WasmObjectWriter and
|
||||
// TargetLoweringObjectFileWasm
|
||||
.StartsWith(".init_array", SectionKind::getData())
|
||||
.StartsWith(".debug_", SectionKind::getMetadata())
|
||||
.Default(Optional<SectionKind>());
|
||||
if (!Kind.hasValue())
|
||||
return Parser->Error(Lexer->getLoc(), "unknown section kind: " + Name);
|
||||
|
Loading…
Reference in New Issue
Block a user