Merge "Add symbols for start and end of embedded linker"
diff --git a/cmd/extract_linker/main.go b/cmd/extract_linker/main.go
index f1f7bc7..1280553 100644
--- a/cmd/extract_linker/main.go
+++ b/cmd/extract_linker/main.go
@@ -26,7 +26,7 @@
"io/ioutil"
"log"
"os"
- "strings"
+ "strconv"
)
func main() {
@@ -59,20 +59,16 @@
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 @@
}
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 @@
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 @@
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
}