Merge "Add symbols for start and end of embedded linker"
This commit is contained in:
@@ -26,7 +26,7 @@ import (
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -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 {
|
||||
@@ -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)
|
||||
@@ -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, "}")
|
||||
@@ -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"
|
||||
}
|
||||
return nil
|
||||
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 s
|
||||
}
|
||||
|
Reference in New Issue
Block a user