Loading cmd/extract_linker/main.go +36 −16 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ import ( "io/ioutil" "log" "os" "strings" "strconv" ) func main() { Loading Loading @@ -59,20 +59,16 @@ func main() { fmt.Fprintln(script, "ENTRY(__dlwrap__start)") fmt.Fprintln(script, "SECTIONS {") progsWithFlagsCount := make(map[string]int) for _, prog := range ef.Progs { if prog.Type != elf.PT_LOAD { continue } var progName string progSection := progToFirstSection(prog, ef.Sections) if progSection != nil { progName = progSection.Name } else { progName = fmt.Sprintf(".sect%d", load) } sectionName := ".linker" + progName symName := "__dlwrap_linker" + strings.ReplaceAll(progName, ".", "_") progName := progNameFromFlags(prog.Flags, progsWithFlagsCount) sectionName := ".linker_" + progName symName := "__dlwrap_linker_" + progName flags := "" if prog.Flags&elf.PF_W != 0 { Loading @@ -83,6 +79,12 @@ func main() { } fmt.Fprintf(asm, ".section %s, \"a%s\"\n", sectionName, flags) if load == 0 { fmt.Fprintln(asm, ".globl __dlwrap_linker") fmt.Fprintln(asm, "__dlwrap_linker:") fmt.Fprintln(asm) } fmt.Fprintf(asm, ".globl %s\n%s:\n\n", symName, symName) fmt.Fprintf(script, " %s 0x%x : {\n", sectionName, baseLoadAddr+prog.Vaddr) Loading @@ -106,6 +108,10 @@ func main() { load += 1 } fmt.Fprintln(asm, ".globl __dlwrap_linker_end") fmt.Fprintln(asm, "__dlwrap_linker_end:") fmt.Fprintln(asm) fmt.Fprintln(asm, `.section .note.android.embedded_linker,"a",%note`) fmt.Fprintln(script, "}") Loading Loading @@ -139,11 +145,25 @@ func bytesToAsm(asm io.Writer, buf []byte) { fmt.Fprintln(asm) } func progToFirstSection(prog *elf.Prog, sections []*elf.Section) *elf.Section { for _, section := range sections { if section.Addr == prog.Vaddr { return section func progNameFromFlags(flags elf.ProgFlag, progsWithFlagsCount map[string]int) string { s := "" if flags&elf.PF_R != 0 { s += "r" } if flags&elf.PF_W != 0 { s += "w" } if flags&elf.PF_X != 0 { s += "x" } count := progsWithFlagsCount[s] count++ progsWithFlagsCount[s] = count if count > 1 { s += strconv.Itoa(count) } return nil return s } Loading
cmd/extract_linker/main.go +36 −16 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ import ( "io/ioutil" "log" "os" "strings" "strconv" ) func main() { Loading Loading @@ -59,20 +59,16 @@ func main() { fmt.Fprintln(script, "ENTRY(__dlwrap__start)") fmt.Fprintln(script, "SECTIONS {") progsWithFlagsCount := make(map[string]int) for _, prog := range ef.Progs { if prog.Type != elf.PT_LOAD { continue } var progName string progSection := progToFirstSection(prog, ef.Sections) if progSection != nil { progName = progSection.Name } else { progName = fmt.Sprintf(".sect%d", load) } sectionName := ".linker" + progName symName := "__dlwrap_linker" + strings.ReplaceAll(progName, ".", "_") progName := progNameFromFlags(prog.Flags, progsWithFlagsCount) sectionName := ".linker_" + progName symName := "__dlwrap_linker_" + progName flags := "" if prog.Flags&elf.PF_W != 0 { Loading @@ -83,6 +79,12 @@ func main() { } fmt.Fprintf(asm, ".section %s, \"a%s\"\n", sectionName, flags) if load == 0 { fmt.Fprintln(asm, ".globl __dlwrap_linker") fmt.Fprintln(asm, "__dlwrap_linker:") fmt.Fprintln(asm) } fmt.Fprintf(asm, ".globl %s\n%s:\n\n", symName, symName) fmt.Fprintf(script, " %s 0x%x : {\n", sectionName, baseLoadAddr+prog.Vaddr) Loading @@ -106,6 +108,10 @@ func main() { load += 1 } fmt.Fprintln(asm, ".globl __dlwrap_linker_end") fmt.Fprintln(asm, "__dlwrap_linker_end:") fmt.Fprintln(asm) fmt.Fprintln(asm, `.section .note.android.embedded_linker,"a",%note`) fmt.Fprintln(script, "}") Loading Loading @@ -139,11 +145,25 @@ func bytesToAsm(asm io.Writer, buf []byte) { fmt.Fprintln(asm) } func progToFirstSection(prog *elf.Prog, sections []*elf.Section) *elf.Section { for _, section := range sections { if section.Addr == prog.Vaddr { return section func progNameFromFlags(flags elf.ProgFlag, progsWithFlagsCount map[string]int) string { s := "" if flags&elf.PF_R != 0 { s += "r" } if flags&elf.PF_W != 0 { s += "w" } if flags&elf.PF_X != 0 { s += "x" } count := progsWithFlagsCount[s] count++ progsWithFlagsCount[s] = count if count > 1 { s += strconv.Itoa(count) } return nil return s }