@@ -829,23 +829,14 @@ enum RankFlags {
829
829
RF_NOT_ADDR_SET = 1 << 27 ,
830
830
RF_NOT_ALLOC = 1 << 26 ,
831
831
RF_PARTITION = 1 << 18 , // Partition number (8 bits)
832
- RF_NOT_PART_EHDR = 1 << 17 ,
833
- RF_NOT_PART_PHDR = 1 << 16 ,
834
- RF_NOT_INTERP = 1 << 15 ,
835
- RF_NOT_NOTE = 1 << 14 ,
832
+ RF_NOT_SPECIAL = 1 << 17 ,
836
833
RF_WRITE = 1 << 13 ,
837
834
RF_EXEC_WRITE = 1 << 12 ,
838
835
RF_EXEC = 1 << 11 ,
839
836
RF_RODATA = 1 << 10 ,
840
837
RF_NOT_RELRO = 1 << 9 ,
841
838
RF_NOT_TLS = 1 << 8 ,
842
839
RF_BSS = 1 << 7 ,
843
- RF_PPC_TOC = 1 << 4 ,
844
- RF_PPC_GOT = 1 << 3 ,
845
- RF_PPC_BRANCH_LT = 1 << 2 ,
846
- RF_MIPS_GPREL = 1 << 1 ,
847
- RF_MIPS_NOT_GOT = 1 << 0 ,
848
- RF_RISCV_SDATA = 1 << 0 ,
849
840
};
850
841
851
842
static unsigned getSectionRank (const OutputSection &osec) {
@@ -864,71 +855,53 @@ static unsigned getSectionRank(const OutputSection &osec) {
864
855
865
856
if (osec.type == SHT_LLVM_PART_EHDR)
866
857
return rank;
867
- rank |= RF_NOT_PART_EHDR;
868
-
869
858
if (osec.type == SHT_LLVM_PART_PHDR)
870
- return rank;
871
- rank |= RF_NOT_PART_PHDR;
859
+ return rank | 1 ;
872
860
873
861
// Put .interp first because some loaders want to see that section
874
862
// on the first page of the executable file when loaded into memory.
875
863
if (osec.name == " .interp" )
876
- return rank;
877
- rank |= RF_NOT_INTERP;
864
+ return rank | 2 ;
878
865
879
- // Put .note sections (which make up one PT_NOTE) at the beginning so that
880
- // they are likely to be included in a core file even if core file size is
881
- // limited. In particular, we want a .note.gnu.build-id and a .note.tag to be
882
- // included in a core to match core files with executables.
866
+ // Put .note sections at the beginning so that they are likely to be included
867
+ // in a truncate core file. In particular, .note.gnu.build-id, if available,
868
+ // can identify the object file.
883
869
if (osec.type == SHT_NOTE)
884
- return rank;
885
- rank |= RF_NOT_NOTE;
870
+ return rank | 3 ;
871
+
872
+ rank |= RF_NOT_SPECIAL;
886
873
887
874
// Sort sections based on their access permission in the following
888
- // order: R, RX, RWX , RW. This order is based on the following
889
- // considerations:
890
- // * Read-only sections come first such that they go in the
891
- // PT_LOAD covering the program headers at the start of the file.
892
- // * Read-only, executable sections come next.
893
- // * Writable, executable sections follow such that .plt on
894
- // architectures where it needs to be writable will be placed
895
- // between .text and .data.
896
- // * Writable sections come last, such that .bss lands at the very
897
- // end of the last PT_LOAD .
875
+ // order: R, RX, RXW , RW(RELRO), RW(non-RELRO).
876
+ //
877
+ // Read-only sections come first such that they go in the PT_LOAD covering the
878
+ // program headers at the start of the file.
879
+ //
880
+ // The layout for writable sections is PT_LOAD(PT_GNU_RELRO(.data.rel.ro
881
+ // .bss.rel.ro) | .data .bss), where | marks where page alignment happens.
882
+ // An alternative ordering is PT_LOAD(.data | PT_GNU_RELRO( .data.rel.ro
883
+ // .bss.rel.ro) | .bss), but it may waste more bytes due to 2 alignment
884
+ // places .
898
885
bool isExec = osec.flags & SHF_EXECINSTR;
899
886
bool isWrite = osec.flags & SHF_WRITE;
900
887
901
- if (isExec) {
902
- if (isWrite)
903
- rank |= RF_EXEC_WRITE;
904
- else
905
- rank |= RF_EXEC;
906
- } else if (isWrite) {
888
+ if (!isWrite && !isExec) {
889
+ // Make PROGBITS sections (e.g .rodata .eh_frame) closer to .text to
890
+ // alleviate relocation overflow pressure. Large special sections such as
891
+ // .dynstr and .dynsym can be away from .text.
892
+ if (osec.type == SHT_PROGBITS)
893
+ rank |= RF_RODATA;
894
+ } else if (isExec) {
895
+ rank |= isWrite ? RF_EXEC_WRITE : RF_EXEC;
896
+ } else {
907
897
rank |= RF_WRITE;
908
- } else if (osec.type == SHT_PROGBITS) {
909
- // Make non-executable and non-writable PROGBITS sections (e.g .rodata
910
- // .eh_frame) closer to .text. They likely contain PC or GOT relative
911
- // relocations and there could be relocation overflow if other huge sections
912
- // (.dynstr .dynsym) were placed in between.
913
- rank |= RF_RODATA;
914
- }
915
-
916
- // Place RelRo sections first. After considering SHT_NOBITS below, the
917
- // ordering is PT_LOAD(PT_GNU_RELRO(.data.rel.ro .bss.rel.ro) | .data .bss),
918
- // where | marks where page alignment happens. An alternative ordering is
919
- // PT_LOAD(.data | PT_GNU_RELRO( .data.rel.ro .bss.rel.ro) | .bss), but it may
920
- // waste more bytes due to 2 alignment places.
921
- if (!isRelroSection (&osec))
922
- rank |= RF_NOT_RELRO;
923
-
924
- // If we got here we know that both A and B are in the same PT_LOAD.
925
-
926
- // The TLS initialization block needs to be a single contiguous block in a R/W
927
- // PT_LOAD, so stick TLS sections directly before the other RelRo R/W
928
- // sections. Since p_filesz can be less than p_memsz, place NOBITS sections
929
- // after PROGBITS.
930
- if (!(osec.flags & SHF_TLS))
931
- rank |= RF_NOT_TLS;
898
+ // The TLS initialization block needs to be a single contiguous block. Place
899
+ // TLS sections directly before the other RELRO sections.
900
+ if (!(osec.flags & SHF_TLS))
901
+ rank |= RF_NOT_TLS;
902
+ if (!isRelroSection (&osec))
903
+ rank |= RF_NOT_RELRO;
904
+ }
932
905
933
906
// Within TLS sections, or within other RelRo sections, or within non-RelRo
934
907
// sections, place non-NOBITS sections first.
@@ -943,32 +916,29 @@ static unsigned getSectionRank(const OutputSection &osec) {
943
916
// their coverage by a single signed 16-bit offset from the TOC base
944
917
// pointer.
945
918
StringRef name = osec.name ;
946
- if (name == " .toc" )
947
- rank |= RF_PPC_TOC;
948
-
949
- if (name == " .got" )
950
- rank |= RF_PPC_GOT;
951
-
952
919
if (name == " .branch_lt" )
953
- rank |= RF_PPC_BRANCH_LT;
920
+ rank |= 1 ;
921
+ else if (name == " .got" )
922
+ rank |= 2 ;
923
+ else if (name == " .toc" )
924
+ rank |= 4 ;
954
925
}
955
926
956
927
if (config->emachine == EM_MIPS) {
928
+ if (osec.name != " .got" )
929
+ rank |= 1 ;
957
930
// All sections with SHF_MIPS_GPREL flag should be grouped together
958
931
// because data in these sections is addressable with a gp relative address.
959
932
if (osec.flags & SHF_MIPS_GPREL)
960
- rank |= RF_MIPS_GPREL;
961
-
962
- if (osec.name != " .got" )
963
- rank |= RF_MIPS_NOT_GOT;
933
+ rank |= 2 ;
964
934
}
965
935
966
936
if (config->emachine == EM_RISCV) {
967
937
// .sdata and .sbss are placed closer to make GP relaxation more profitable
968
938
// and match GNU ld.
969
939
StringRef name = osec.name ;
970
940
if (name == " .sdata" || (osec.type == SHT_NOBITS && name != " .sbss" ))
971
- rank |= RF_RISCV_SDATA ;
941
+ rank |= 1 ;
972
942
}
973
943
974
944
return rank;
0 commit comments