@@ -375,14 +375,7 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySections() {
375
375
}
376
376
}
377
377
378
- if (GraphSec->getMemProt () != Prot) {
379
- std::string ErrMsg;
380
- raw_string_ostream (ErrMsg)
381
- << " In " << G->getName () << " , section " << *Name
382
- << " is present more than once with different permissions: "
383
- << GraphSec->getMemProt () << " vs " << Prot;
384
- return make_error<JITLinkError>(std::move (ErrMsg));
385
- }
378
+ GraphSec->setMemProt (GraphSec->getMemProt () | Prot);
386
379
387
380
Block *B = nullptr ;
388
381
if (Sec.sh_type != ELF::SHT_NOBITS) {
@@ -513,7 +506,14 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
513
506
TargetFlagsType Flags = makeTargetFlags (Sym);
514
507
orc::ExecutorAddrDiff Offset = getRawOffset (Sym, Flags);
515
508
516
- if (Offset + Sym.st_size > B->getSize ()) {
509
+ // Truncate symbol if it would overflow -- ELF size fields can't be
510
+ // trusted.
511
+ // FIXME: this makes the following error check unreachable, but it's
512
+ // left here to reduce merge conflicts.
513
+ uint64_t Size =
514
+ std::min (static_cast <uint64_t >(Sym.st_size ), B->getSize () - Offset);
515
+
516
+ if (Offset + Size > B->getSize ()) {
517
517
std::string ErrMsg;
518
518
raw_string_ostream ErrStream (ErrMsg);
519
519
ErrStream << " In " << G->getName () << " , symbol " ;
@@ -536,11 +536,9 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
536
536
// anonymous symbol.
537
537
auto &GSym =
538
538
Name->empty ()
539
- ? G->addAnonymousSymbol (*B, Offset, Sym.st_size ,
540
- false , false )
541
- : G->addDefinedSymbol (*B, Offset, *Name, Sym.st_size , L,
542
- S, Sym.getType () == ELF::STT_FUNC,
543
- false );
539
+ ? G->addAnonymousSymbol (*B, Offset, Size, false , false )
540
+ : G->addDefinedSymbol (*B, Offset, *Name, Size, L, S,
541
+ Sym.getType () == ELF::STT_FUNC, false );
544
542
545
543
GSym.setTargetFlags (Flags);
546
544
setGraphSymbol (SymIndex, GSym);
0 commit comments