mirror of https://github.com/tinygo-org/tinygo.git
wasmstm32webassemblymicrocontrollerarmavrspiwasiadafruitarduinocircuitplayground-expressgpioi2cllvmmicrobitnrf51nrf52nrf52840samd21tinygo
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.4 KiB
57 lines
1.4 KiB
package builder
|
|
|
|
import (
|
|
"debug/elf"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
func getElfSectionData(executable string, sectionName string) ([]byte, elf.FileHeader, error) {
|
|
elfFile, err := elf.Open(executable)
|
|
if err != nil {
|
|
return nil, elf.FileHeader{}, err
|
|
}
|
|
defer elfFile.Close()
|
|
|
|
section := elfFile.Section(sectionName)
|
|
if section == nil {
|
|
return nil, elf.FileHeader{}, fmt.Errorf("could not find %s section", sectionName)
|
|
}
|
|
|
|
data, err := section.Data()
|
|
|
|
return data, elfFile.FileHeader, err
|
|
}
|
|
|
|
func replaceElfSection(executable string, sectionName string, data []byte) error {
|
|
fp, err := os.OpenFile(executable, os.O_RDWR, 0)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer fp.Close()
|
|
|
|
elfFile, err := elf.Open(executable)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer elfFile.Close()
|
|
|
|
section := elfFile.Section(sectionName)
|
|
if section == nil {
|
|
return fmt.Errorf("could not find %s section", sectionName)
|
|
}
|
|
|
|
// Implicitly check for compressed sections
|
|
if section.Size != section.FileSize {
|
|
return fmt.Errorf("expected section %s to have identical size and file size, got %d and %d", sectionName, section.Size, section.FileSize)
|
|
}
|
|
|
|
// Only permit complete replacement of section
|
|
if section.Size != uint64(len(data)) {
|
|
return fmt.Errorf("expected section %s to have size %d, was actually %d", sectionName, len(data), section.Size)
|
|
}
|
|
|
|
// Write the replacement section data
|
|
_, err = fp.WriteAt(data, int64(section.Offset))
|
|
return err
|
|
}
|
|
|