Skip to content

Commit

Permalink
ReadDependPkg check symbol in symPtr
Browse files Browse the repository at this point in the history
  • Loading branch information
pkujhd committed Feb 17, 2024
1 parent 985605b commit 3b6cea6
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 13 deletions.
25 changes: 15 additions & 10 deletions ld.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,15 +127,15 @@ func (linker *Linker) addSymbols() error {
linker.Noptrdata = append(linker.Noptrdata, make([]byte, IntSize)...)
for _, objSym := range linker.ObjSymbolMap {
if objSym.Kind == symkind.STEXT && objSym.DupOK == false {
if _, err := linker.addSymbol(objSym.Name); err != nil {
if _, err := linker.addSymbol(objSym.Name, nil); err != nil {
return err
}
}
}
for _, pkg := range linker.Packages {
initFuncName := getInitFuncName(pkg.PkgPath)
if _, ok := linker.ObjSymbolMap[initFuncName]; ok {
if _, err := linker.addSymbol(initFuncName); err != nil {
if _, err := linker.addSymbol(initFuncName, nil); err != nil {
return err
}
}
Expand Down Expand Up @@ -168,14 +168,19 @@ func (linker *Linker) adaptSymbolOffset() {
}
}

func (linker *Linker) addSymbol(name string) (symbol *obj.Sym, err error) {
func (linker *Linker) addSymbol(name string, symPtr map[string]uintptr) (symbol *obj.Sym, err error) {
if symbol, ok := linker.SymMap[name]; ok {
return symbol, nil
}
objsym := linker.ObjSymbolMap[name]
symbol = &obj.Sym{Name: objsym.Name, Kind: objsym.Kind}
linker.SymMap[symbol.Name] = symbol

if symPtr != nil {
if _, ok := symPtr[name]; ok {
symbol.Offset = InvalidOffset
return symbol, nil
}
}
switch symbol.Kind {
case symkind.STEXT:
symbol.Offset = len(linker.Code)
Expand All @@ -186,7 +191,7 @@ func (linker *Linker) addSymbol(name string) (symbol *obj.Sym, err error) {
}
bytearrayAlignNops(linker.Arch, &linker.Code, funcalign.GetFuncAlign(linker.Arch))
symbol.Func = &obj.Func{}
if err := linker.readFuncData(linker.ObjSymbolMap[name], symbol.Offset); err != nil {
if err := linker.readFuncData(linker.ObjSymbolMap[name], symbol.Offset, symPtr); err != nil {
return nil, err
}
case symkind.SDATA:
Expand Down Expand Up @@ -224,11 +229,11 @@ func (linker *Linker) addSymbol(name string) (symbol *obj.Sym, err error) {
reloc.Epilogue.Offset += symbol.Offset
}
if _, ok := linker.ObjSymbolMap[reloc.SymName]; ok {
relocSym, err := linker.addSymbol(reloc.SymName)
relocSym, err := linker.addSymbol(reloc.SymName, symPtr)
if err != nil {
return nil, err
}
if len(linker.ObjSymbolMap[reloc.SymName].Data) == 0 && reloc.Size > 0 {
if relocSym != nil && len(linker.ObjSymbolMap[reloc.SymName].Data) == 0 && reloc.Size > 0 {
//static_tmp is 0, golang compile not allocate memory.
//goloader add IntSize bytes on linker.Noptrdata[0]
if reloc.Size <= IntSize {
Expand Down Expand Up @@ -277,14 +282,14 @@ func (linker *Linker) addSymbol(name string) (symbol *obj.Sym, err error) {
if _, ok := linker.ObjSymbolMap[objsym.Type]; !ok {
linker.SymMap[objsym.Type] = &obj.Sym{Name: objsym.Type, Offset: InvalidOffset}
} else {
linker.addSymbol(objsym.Type)
linker.addSymbol(objsym.Type, symPtr)
}
}
}
return symbol, nil
}

func (linker *Linker) readFuncData(symbol *obj.ObjSymbol, codeLen int) (err error) {
func (linker *Linker) readFuncData(symbol *obj.ObjSymbol, codeLen int, symPtr map[string]uintptr) (err error) {
nameOff := len(linker.Pclntable)
if offset, ok := linker.NameMap[symbol.Name]; !ok {
linker.NameMap[symbol.Name] = len(linker.Pclntable)
Expand Down Expand Up @@ -332,7 +337,7 @@ func (linker *Linker) readFuncData(symbol *obj.ObjSymbol, codeLen int) (err erro
} else {
if _, ok := linker.SymMap[name]; !ok {
if _, ok := linker.ObjSymbolMap[name]; ok {
if _, err = linker.addSymbol(name); err != nil {
if _, err = linker.addSymbol(name, symPtr); err != nil {
return err
}
} else {
Expand Down
6 changes: 3 additions & 3 deletions readobj.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ func ReadObjs(files []string, pkgPaths []string) (*Linker, error) {
return linker, nil
}

func (linker *Linker) ReadDependPkg(file, pkgPath string, symbolNames []string) error {
func (linker *Linker) ReadDependPkg(file, pkgPath string, symbolNames []string, symPtr map[string]uintptr) error {
if linker.AdaptedOffset {
return fmt.Errorf("already adapted symbol offset, don't add new symbols")
}
Expand All @@ -91,14 +91,14 @@ func (linker *Linker) ReadDependPkg(file, pkgPath string, symbolNames []string)
}
initFuncName := getInitFuncName(pkgPath)
if _, ok := linker.ObjSymbolMap[initFuncName]; ok {
if _, err := linker.addSymbol(initFuncName); err != nil {
if _, err := linker.addSymbol(initFuncName, nil); err != nil {
return err
}
}
for _, name := range symbolNames {
if _, ok := linker.ObjSymbolMap[name]; ok {
delete(linker.SymMap, name)
_, err := linker.addSymbol(name)
_, err := linker.addSymbol(name, symPtr)
if err != nil {
return err
}
Expand Down

0 comments on commit 3b6cea6

Please sign in to comment.