// RUN: wasm-ld -O0 %t.o -o %t2.wasm --no-gc-sections --no-entry
// RUN: obj2yaml %t2.wasm | FileCheck --check-prefixes=COMMON,NOMERGE %s
+// Check relocatable
+// RUN: wasm-ld -r %t.o -o %t2.o
+// RUN: obj2yaml %t2.o | FileCheck --check-prefixes=RELOC %s
+
.section .rodata1,"S",@
.asciz "abc"
foo:
bar:
.asciz "bc"
.asciz "bc"
- .size bar, 4
+ .size bar, 6
.section .rodata_relocs,"",@
negative_addend:
// COMMON-NEXT: Value: 1024
// MERGE-NEXT: Content: '61626300'
// NOMERGE-NEXT: Content: '6162630061626300626300'
+
+
+// RELOC: - Type: DATA
+// RELOC-NEXT: Relocations:
+// RELOC-NEXT: - Type: R_WASM_MEMORY_ADDR_I32
+// RELOC-NEXT: Index: 0
+// RELOC-NEXT: Offset: 0xF
+// RELOC-NEXT: Addend: -10
+// RELOC-NEXT: Segments:
+// RELOC-NEXT: - SectionOffset: 6
+// RELOC-NEXT: InitFlags: 0
+// RELOC-NEXT: Offset:
+// RELOC-NEXT: Opcode: I32_CONST
+// RELOC-NEXT: Value: 0
+// RELOC-NEXT: Content: '61626300'
+// RELOC-NEXT: - SectionOffset: 15
+// RELOC-NEXT: InitFlags: 0
+// RELOC-NEXT: Offset:
+// RELOC-NEXT: Opcode: I32_CONST
+// RELOC-NEXT: Value: 4
+// RELOC-NEXT: Content: F6FFFFFF
object_error::parse_failed);
auto Offset = readVaruint64(Ctx);
auto Size = readVaruint64(Ctx);
- if (Offset + Size > DataSegments[Index].Data.Content.size())
- return make_error<GenericBinaryError>("invalid data symbol offset",
- object_error::parse_failed);
+ size_t SegmentSize = DataSegments[Index].Data.Content.size();
+ if (Offset > SegmentSize)
+ return make_error<GenericBinaryError>(
+ "invalid data symbol offset: `" + Info.Name + "` (offset: " +
+ Twine(Offset) + " segment size: " + Twine(SegmentSize) + ")",
+ object_error::parse_failed);
Info.DataRef = wasm::WasmDataReference{Index, Offset, Size};
}
break;
--- /dev/null
+# RUN: yaml2obj %s | not llvm-objdump -s - 2>&1 | FileCheck %s
+
+# Check that data symbols must have and offset that is within the
+# bounds of the containing segment
+
+# CHECK: invalid data symbol offset: `foo` (offset: 42 segment size: 5)
+
+--- !WASM
+FileHeader:
+ Version: 0x00000001
+Sections:
+ - Type: DATA
+ Segments:
+ - SectionOffset: 0
+ InitFlags: 0
+ Offset:
+ Opcode: I32_CONST
+ Value: 0
+ Content: '6401020304'
+ - Type: CUSTOM
+ Name: linking
+ Version: 2
+ SymbolTable:
+ - Index: 0
+ Kind: DATA
+ Name: foo
+ Flags: [ ]
+ Segment: 0
+ Offset: 42
+ Size: 1
+...