@@ -1073,17 +1073,23 @@ void WasmBinaryWriter::writeDylinkSection() {
1073
1073
}
1074
1074
1075
1075
auto start = startSection (BinaryConsts::User);
1076
- writeInlineString (BinaryConsts::UserSections::Dylink);
1076
+ writeInlineString (BinaryConsts::UserSections::Dylink0);
1077
+
1078
+ auto substart = startSubsection (BinaryConsts::UserSections::Subsection::DylinkMemInfo);
1077
1079
o << U32LEB (wasm->dylinkSection ->memorySize );
1078
1080
o << U32LEB (wasm->dylinkSection ->memoryAlignment );
1079
1081
o << U32LEB (wasm->dylinkSection ->tableSize );
1080
1082
o << U32LEB (wasm->dylinkSection ->tableAlignment );
1081
- o << U32LEB (wasm->dylinkSection ->neededDynlibs .size ());
1082
- for (auto & neededDynlib : wasm->dylinkSection ->neededDynlibs ) {
1083
- writeInlineString (neededDynlib.c_str ());
1084
- }
1083
+ finishSubsection (substart);
1085
1084
1086
- writeData (wasm->dylinkSection ->tail .data (), wasm->dylinkSection ->tail .size ());
1085
+ if (wasm->dylinkSection ->neededDynlibs .size ()) {
1086
+ substart = startSubsection (BinaryConsts::UserSections::Subsection::DylinkNeeded);
1087
+ o << U32LEB (wasm->dylinkSection ->neededDynlibs .size ());
1088
+ for (auto & neededDynlib : wasm->dylinkSection ->neededDynlibs ) {
1089
+ writeInlineString (neededDynlib.c_str ());
1090
+ }
1091
+ finishSubsection (substart);
1092
+ }
1087
1093
1088
1094
finishSection (start);
1089
1095
}
@@ -1435,6 +1441,7 @@ void WasmBinaryBuilder::read() {
1435
1441
}
1436
1442
1437
1443
void WasmBinaryBuilder::readUserSection (size_t payloadLen) {
1444
+ BYN_TRACE (" == readUserSection\n " );
1438
1445
auto oldPos = pos;
1439
1446
Name sectionName = getInlineString ();
1440
1447
size_t read = pos - oldPos;
@@ -1452,6 +1459,8 @@ void WasmBinaryBuilder::readUserSection(size_t payloadLen) {
1452
1459
readFeatures (payloadLen);
1453
1460
} else if (sectionName.equals (BinaryConsts::UserSections::Dylink)) {
1454
1461
readDylink (payloadLen);
1462
+ } else if (sectionName.equals (BinaryConsts::UserSections::Dylink0)) {
1463
+ readDylink0 (payloadLen);
1455
1464
} else {
1456
1465
// an unfamiliar custom section
1457
1466
if (sectionName.equals (BinaryConsts::UserSections::Linking)) {
@@ -3250,8 +3259,6 @@ void WasmBinaryBuilder::readFeatures(size_t payloadLen) {
3250
3259
void WasmBinaryBuilder::readDylink (size_t payloadLen) {
3251
3260
wasm.dylinkSection = make_unique<DylinkSection>();
3252
3261
3253
- auto sectionPos = pos;
3254
-
3255
3262
wasm.dylinkSection ->memorySize = getU32LEB ();
3256
3263
wasm.dylinkSection ->memoryAlignment = getU32LEB ();
3257
3264
wasm.dylinkSection ->tableSize = getU32LEB ();
@@ -3261,13 +3268,46 @@ void WasmBinaryBuilder::readDylink(size_t payloadLen) {
3261
3268
for (size_t i = 0 ; i < numNeededDynlibs; ++i) {
3262
3269
wasm.dylinkSection ->neededDynlibs .push_back (getInlineString ());
3263
3270
}
3271
+ }
3272
+
3273
+ void WasmBinaryBuilder::readDylink0 (size_t payloadLen) {
3274
+ BYN_TRACE (" == readDylink0\n " );
3275
+ auto sectionPos = pos;
3276
+ uint32_t lastType = 0 ;
3264
3277
3265
- size_t remaining = (sectionPos + payloadLen) - pos;
3266
- auto tail = getByteView (remaining);
3267
- wasm.dylinkSection ->tail = {tail.first , tail.second };
3278
+ wasm.dylinkSection = make_unique<DylinkSection>();
3279
+ while (pos < sectionPos + payloadLen) {
3280
+ auto dylinkType = getU32LEB ();
3281
+ if (lastType && dylinkType <= lastType) {
3282
+ std::cerr << " warning: out-of-order dylink.0 subsection: " << dylinkType
3283
+ << std::endl;
3284
+ }
3285
+ lastType = dylinkType;
3286
+ auto subsectionSize = getU32LEB ();
3287
+ auto subsectionPos = pos;
3288
+ if (dylinkType == BinaryConsts::UserSections::Subsection::DylinkMemInfo) {
3289
+ wasm.dylinkSection ->memorySize = getU32LEB ();
3290
+ wasm.dylinkSection ->memoryAlignment = getU32LEB ();
3291
+ wasm.dylinkSection ->tableSize = getU32LEB ();
3292
+ wasm.dylinkSection ->tableAlignment = getU32LEB ();
3293
+ } else if (dylinkType ==
3294
+ BinaryConsts::UserSections::Subsection::DylinkNeeded) {
3295
+ size_t numNeededDynlibs = getU32LEB ();
3296
+ for (size_t i = 0 ; i < numNeededDynlibs; ++i) {
3297
+ wasm.dylinkSection ->neededDynlibs .push_back (getInlineString ());
3298
+ }
3299
+ } else {
3300
+ std::cerr << " warning: unknown name subsection with id "
3301
+ << std::to_string (dylinkType) << " at " << pos << std::endl;
3302
+ pos = subsectionPos + subsectionSize;
3303
+ }
3304
+ if (pos != subsectionPos + subsectionSize) {
3305
+ throwError (" bad dylink.0 subsection position change" );
3306
+ }
3307
+ }
3268
3308
3269
3309
if (pos != sectionPos + payloadLen) {
3270
- throwError (" bad features section size" );
3310
+ throwError (" bad dylink.0 section size" );
3271
3311
}
3272
3312
}
3273
3313
0 commit comments