@@ -626,6 +626,9 @@ Error RewriteInstance::discoverStorage() {
626
626
NextAvailableAddress += BC->PageAlign ;
627
627
}
628
628
629
+ NewTextSegmentAddress = NextAvailableAddress;
630
+ NewTextSegmentOffset = NextAvailableOffset;
631
+
629
632
if (!opts::UseGnuStack && !BC->IsLinuxKernel ) {
630
633
// This is where the black magic happens. Creating PHDR table in a segment
631
634
// other than that containing ELF header is tricky. Some loaders and/or
@@ -652,6 +655,8 @@ Error RewriteInstance::discoverStorage() {
652
655
653
656
PHDRTableAddress = NextAvailableAddress;
654
657
PHDRTableOffset = NextAvailableOffset;
658
+ NewTextSegmentAddress = NextAvailableAddress;
659
+ NewTextSegmentOffset = NextAvailableOffset;
655
660
656
661
// Reserve space for 3 extra pheaders.
657
662
unsigned Phnum = Obj.getHeader ().e_phnum ;
@@ -664,14 +669,12 @@ Error RewriteInstance::discoverStorage() {
664
669
665
670
NextAvailableAddress += Phnum * sizeof (ELF64LEPhdrTy);
666
671
NextAvailableOffset += Phnum * sizeof (ELF64LEPhdrTy);
667
- }
668
672
669
- // Align at cache line.
670
- NextAvailableAddress = alignTo (NextAvailableAddress, 64 );
671
- NextAvailableOffset = alignTo (NextAvailableOffset, 64 );
673
+ // Align at cache line.
674
+ NextAvailableAddress = alignTo (NextAvailableAddress, 64 );
675
+ NextAvailableOffset = alignTo (NextAvailableOffset, 64 );
676
+ }
672
677
673
- NewTextSegmentAddress = NextAvailableAddress;
674
- NewTextSegmentOffset = NextAvailableOffset;
675
678
BC->LayoutStartAddress = NextAvailableAddress;
676
679
677
680
// Tools such as objcopy can strip section contents but leave header
@@ -4133,13 +4136,8 @@ void RewriteInstance::mapAllocatableSections(
4133
4136
}
4134
4137
4135
4138
if (SType == ST_READONLY) {
4136
- if (PHDRTableAddress) {
4137
- // Segment size includes the size of the PHDR area.
4138
- NewTextSegmentSize = NextAvailableAddress - PHDRTableAddress;
4139
- } else if (NewTextSegmentAddress) {
4140
- // Existing PHDR table would be updated.
4139
+ if (NewTextSegmentAddress)
4141
4140
NewTextSegmentSize = NextAvailableAddress - NewTextSegmentAddress;
4142
- }
4143
4141
} else if (SType == ST_READWRITE) {
4144
4142
NewWritableSegmentSize = NextAvailableAddress - NewWritableSegmentAddress;
4145
4143
// Restore NextAvailableAddress if no new writable sections
@@ -4186,9 +4184,7 @@ void RewriteInstance::patchELFPHDRTable() {
4186
4184
// NOTE Currently .eh_frame_hdr appends to the last segment, recalculate
4187
4185
// last segments size based on the NextAvailableAddress variable.
4188
4186
if (!NewWritableSegmentSize) {
4189
- if (PHDRTableAddress)
4190
- NewTextSegmentSize = NextAvailableAddress - PHDRTableAddress;
4191
- else if (NewTextSegmentAddress)
4187
+ if (NewTextSegmentAddress)
4192
4188
NewTextSegmentSize = NextAvailableAddress - NewTextSegmentAddress;
4193
4189
} else {
4194
4190
NewWritableSegmentSize = NextAvailableAddress - NewWritableSegmentAddress;
@@ -4201,15 +4197,9 @@ void RewriteInstance::patchELFPHDRTable() {
4201
4197
SmallVector<ELF64LEPhdrTy, 3 > NewPhdrs;
4202
4198
ELF64LEPhdrTy NewPhdr;
4203
4199
NewPhdr.p_type = ELF::PT_LOAD;
4204
- if (PHDRTableAddress) {
4205
- NewPhdr.p_offset = PHDRTableOffset;
4206
- NewPhdr.p_vaddr = PHDRTableAddress;
4207
- NewPhdr.p_paddr = PHDRTableAddress;
4208
- } else {
4209
- NewPhdr.p_offset = NewTextSegmentOffset;
4210
- NewPhdr.p_vaddr = NewTextSegmentAddress;
4211
- NewPhdr.p_paddr = NewTextSegmentAddress;
4212
- }
4200
+ NewPhdr.p_offset = NewTextSegmentOffset;
4201
+ NewPhdr.p_vaddr = NewTextSegmentAddress;
4202
+ NewPhdr.p_paddr = NewTextSegmentAddress;
4213
4203
NewPhdr.p_filesz = NewTextSegmentSize;
4214
4204
NewPhdr.p_memsz = NewTextSegmentSize;
4215
4205
NewPhdr.p_flags = ELF::PF_X | ELF::PF_R;
@@ -4270,7 +4260,7 @@ void RewriteInstance::patchELFPHDRTable() {
4270
4260
};
4271
4261
4272
4262
auto writeNewSegmentPhdrs = [&]() {
4273
- if (PHDRTableAddress || NewTextSegmentSize) {
4263
+ if (NewTextSegmentSize) {
4274
4264
SmallVector<ELF64LE::Phdr, 3 > NewPhdrs = createNewPhdrs ();
4275
4265
OS.write (reinterpret_cast <const char *>(NewPhdrs.data ()),
4276
4266
sizeof (ELF64LE::Phdr) * NewPhdrs.size ());
0 commit comments