From b64f763d38c4acbca46ef4ec96ceaf67e3e32986 Mon Sep 17 00:00:00 2001 From: kiwidog Date: Sat, 26 Aug 2023 18:51:56 -0700 Subject: [PATCH] Add fix for incorrect TLS alignment --- pkg/oelf/OELFGenProgramHeaders.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/oelf/OELFGenProgramHeaders.go b/pkg/oelf/OELFGenProgramHeaders.go index 133740a..47359ba 100644 --- a/pkg/oelf/OELFGenProgramHeaders.go +++ b/pkg/oelf/OELFGenProgramHeaders.go @@ -38,7 +38,7 @@ func (orbisElf *OrbisElf) GenerateProgramHeaders() error { // PT_LOAD for relro will be handled by SCE_RELRO, we can get rid of it if gnuRelroSegment != nil { if progHeader.Type == elf.PT_LOAD && progHeader.Off == gnuRelroSegment.Off { - if progHeader.Memsz > (gnuRelroSegment.Memsz + 0x3fff) & ^uint64(0x4000) { + if progHeader.Memsz > (gnuRelroSegment.Memsz+0x3fff) & ^uint64(0x4000) { subtractSize := (gnuRelroSegment.Memsz + 0x3fff) & ^uint64(0x4000) progHeader.Off += subtractSize progHeader.Vaddr += subtractSize @@ -156,6 +156,11 @@ func (orbisElf *OrbisElf) RewriteProgramHeaders() error { // Calculate the offset to write to by indexing into the program header table writeOffset := int64(programHeaderTable + (i * 0x38)) + alignment := progHeader.Align + if uint32(progHeader.Type) == 0x7 { + alignment = 0x20 + } + // Write the structure into a buffer header := elf.Prog64{ Type: uint32(progHeader.Type), @@ -165,7 +170,7 @@ func (orbisElf *OrbisElf) RewriteProgramHeaders() error { Paddr: progHeader.Paddr, Filesz: progHeader.Filesz, Memsz: progHeader.Memsz, - Align: progHeader.Align, + Align: alignment, } if err := binary.Write(progHeaderBuff, binary.LittleEndian, header); err != nil {