Skip to content

Commit c429f48

Browse files
authored
[Object][WebAssembly] Improve error on invalid relocation (#81203)
See emscripten-core/emscripten#21140
1 parent 42230e2 commit c429f48

File tree

2 files changed

+53
-22
lines changed

2 files changed

+53
-22
lines changed

llvm/lib/Object/WasmObjectFile.cpp

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,13 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {
10341034
if (Reloc.Offset < PreviousOffset)
10351035
return make_error<GenericBinaryError>("relocations not in offset order",
10361036
object_error::parse_failed);
1037+
1038+
auto badReloc = [&](StringRef msg) {
1039+
return make_error<GenericBinaryError>(
1040+
msg + ": " + Twine(Symbols[Reloc.Index].Info.Name),
1041+
object_error::parse_failed);
1042+
};
1043+
10371044
PreviousOffset = Reloc.Offset;
10381045
Reloc.Index = readVaruint32(Ctx);
10391046
switch (type) {
@@ -1046,37 +1053,31 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {
10461053
case wasm::R_WASM_TABLE_INDEX_REL_SLEB:
10471054
case wasm::R_WASM_TABLE_INDEX_REL_SLEB64:
10481055
if (!isValidFunctionSymbol(Reloc.Index))
1049-
return make_error<GenericBinaryError>(
1050-
"invalid relocation function index", object_error::parse_failed);
1056+
return badReloc("invalid function relocation");
10511057
break;
10521058
case wasm::R_WASM_TABLE_NUMBER_LEB:
10531059
if (!isValidTableSymbol(Reloc.Index))
1054-
return make_error<GenericBinaryError>("invalid relocation table index",
1055-
object_error::parse_failed);
1060+
return badReloc("invalid table relocation");
10561061
break;
10571062
case wasm::R_WASM_TYPE_INDEX_LEB:
10581063
if (Reloc.Index >= Signatures.size())
1059-
return make_error<GenericBinaryError>("invalid relocation type index",
1060-
object_error::parse_failed);
1064+
return badReloc("invalid relocation type index");
10611065
break;
10621066
case wasm::R_WASM_GLOBAL_INDEX_LEB:
10631067
// R_WASM_GLOBAL_INDEX_LEB are can be used against function and data
10641068
// symbols to refer to their GOT entries.
10651069
if (!isValidGlobalSymbol(Reloc.Index) &&
10661070
!isValidDataSymbol(Reloc.Index) &&
10671071
!isValidFunctionSymbol(Reloc.Index))
1068-
return make_error<GenericBinaryError>("invalid relocation global index",
1069-
object_error::parse_failed);
1072+
return badReloc("invalid global relocation");
10701073
break;
10711074
case wasm::R_WASM_GLOBAL_INDEX_I32:
10721075
if (!isValidGlobalSymbol(Reloc.Index))
1073-
return make_error<GenericBinaryError>("invalid relocation global index",
1074-
object_error::parse_failed);
1076+
return badReloc("invalid global relocation");
10751077
break;
10761078
case wasm::R_WASM_TAG_INDEX_LEB:
10771079
if (!isValidTagSymbol(Reloc.Index))
1078-
return make_error<GenericBinaryError>("invalid relocation tag index",
1079-
object_error::parse_failed);
1080+
return badReloc("invalid tag relocation");
10801081
break;
10811082
case wasm::R_WASM_MEMORY_ADDR_LEB:
10821083
case wasm::R_WASM_MEMORY_ADDR_SLEB:
@@ -1085,8 +1086,7 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {
10851086
case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB:
10861087
case wasm::R_WASM_MEMORY_ADDR_LOCREL_I32:
10871088
if (!isValidDataSymbol(Reloc.Index))
1088-
return make_error<GenericBinaryError>("invalid relocation data index",
1089-
object_error::parse_failed);
1089+
return badReloc("invalid data relocation");
10901090
Reloc.Addend = readVarint32(Ctx);
10911091
break;
10921092
case wasm::R_WASM_MEMORY_ADDR_LEB64:
@@ -1095,26 +1095,22 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {
10951095
case wasm::R_WASM_MEMORY_ADDR_REL_SLEB64:
10961096
case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB64:
10971097
if (!isValidDataSymbol(Reloc.Index))
1098-
return make_error<GenericBinaryError>("invalid relocation data index",
1099-
object_error::parse_failed);
1098+
return badReloc("invalid data relocation");
11001099
Reloc.Addend = readVarint64(Ctx);
11011100
break;
11021101
case wasm::R_WASM_FUNCTION_OFFSET_I32:
11031102
if (!isValidFunctionSymbol(Reloc.Index))
1104-
return make_error<GenericBinaryError>(
1105-
"invalid relocation function index", object_error::parse_failed);
1103+
return badReloc("invalid function relocation");
11061104
Reloc.Addend = readVarint32(Ctx);
11071105
break;
11081106
case wasm::R_WASM_FUNCTION_OFFSET_I64:
11091107
if (!isValidFunctionSymbol(Reloc.Index))
1110-
return make_error<GenericBinaryError>(
1111-
"invalid relocation function index", object_error::parse_failed);
1108+
return badReloc("invalid function relocation");
11121109
Reloc.Addend = readVarint64(Ctx);
11131110
break;
11141111
case wasm::R_WASM_SECTION_OFFSET_I32:
11151112
if (!isValidSectionSymbol(Reloc.Index))
1116-
return make_error<GenericBinaryError>(
1117-
"invalid relocation section index", object_error::parse_failed);
1113+
return badReloc("invalid section relocation");
11181114
Reloc.Addend = readVarint32(Ctx);
11191115
break;
11201116
default:
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# RUN: yaml2obj %s | not llvm-objdump -s - 2>&1 | FileCheck %s
2+
3+
# Check for invalid relocations. In this case we have a relocations of type
4+
# R_WASM_FUNCTION_INDEX_LEB against a symbol (foo) which is not a function
5+
# symbol but a data symbol.
6+
7+
# CHECK: invalid function relocation: foo
8+
9+
--- !WASM
10+
FileHeader:
11+
Version: 0x00000001
12+
Sections:
13+
- Type: DATA
14+
Segments:
15+
- SectionOffset: 0
16+
InitFlags: 0
17+
Offset:
18+
Opcode: I32_CONST
19+
Value: 0
20+
Content: '6401020304'
21+
Relocations:
22+
- Type: R_WASM_FUNCTION_INDEX_LEB
23+
Index: 0
24+
Offset: 0x00000000
25+
- Type: CUSTOM
26+
Name: linking
27+
Version: 2
28+
SymbolTable:
29+
- Index: 0
30+
Kind: DATA
31+
Name: foo
32+
Flags: [ ]
33+
Segment: 0
34+
Offset: 0
35+
Size: 1

0 commit comments

Comments
 (0)