Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -729,9 +729,10 @@ // * It is easy to check if a give branch was taken. // * It is easy two see how similar two ranks are (see getRankProximity). enum RankFlags { - RF_NOT_ADDR_SET = 1 << 18, + RF_NOT_ADDR_SET = 1 << 19, + RF_NOT_ALLOC = 1 << 18, RF_NOT_INTERP = 1 << 17, - RF_NOT_ALLOC = 1 << 16, + RF_NOT_NOTE = 1 << 16, RF_WRITE = 1 << 15, RF_EXEC_WRITE = 1 << 14, RF_EXEC = 1 << 13, @@ -759,17 +760,25 @@ return Rank; Rank |= RF_NOT_ADDR_SET; - // Put .interp first because some loaders want to see that section - // on the first page of the executable file when loaded into memory. - if (Sec->Name == ".interp") - return Rank; - Rank |= RF_NOT_INTERP; - // Allocatable sections go first to reduce the total PT_LOAD size and // so debug info doesn't change addresses in actual code. if (!(Sec->Flags & SHF_ALLOC)) return Rank | RF_NOT_ALLOC; + // Put .interp first because some loaders want to see that section + // on the first page of the executable file when loaded into memory. + if (Sec->Name == ".interp") + return Rank; + Rank |= RF_NOT_INTERP; + + // Put allocatable .note next because they contain information (e.g. + // .note.gnu.build-id identifies the origin of the core) useful in core files. + // This ensures they are always dumped (at least on Linux) because they are in + // the first page. + if (Sec->Type == SHT_NOTE) + return Rank; + Rank |= RF_NOT_NOTE; + // Sort sections based on their access permission in the following // order: R, RX, RWX, RW. This order is based on the following // considerations: