Skip to content

Commit

Permalink
optimize code
Browse files Browse the repository at this point in the history
  • Loading branch information
pkujhd committed Nov 22, 2023
1 parent 22941f1 commit a829246
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 55 deletions.
37 changes: 14 additions & 23 deletions ld.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,14 +102,12 @@ 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 {
_, err := linker.addSymbol(objSym.Name)
if err != nil {
if _, err := linker.addSymbol(objSym.Name); err != nil {
return err
}
}
if objSym.Kind == symkind.SNOPTRDATA {
_, err := linker.addSymbol(objSym.Name)
if err != nil {
if _, err := linker.addSymbol(objSym.Name); err != nil {
return err
}
}
Expand All @@ -118,9 +116,7 @@ func (linker *Linker) addSymbols() error {
offset := 0
switch sym.Kind {
case symkind.SNOPTRDATA, symkind.SRODATA:
if strings.HasPrefix(sym.Name, constants.TypeStringPrefix) {
//nothing todo
} else {
if !strings.HasPrefix(sym.Name, constants.TypeStringPrefix) {
offset += len(linker.data)
}
case symkind.SBSS:
Expand Down Expand Up @@ -215,11 +211,10 @@ func (linker *Linker) addSymbol(name string) (symbol *obj.Sym, err error) {
if reloc.Type == reloctype.R_CALLIND {
reloc.Sym.Offset = 0
}
_, exist := linker.symMap[reloc.Sym.Name]
if strings.HasPrefix(reloc.Sym.Name, constants.TypeImportPathPrefix) {
if exist {
reloc.Sym = linker.symMap[reloc.Sym.Name]
} else {
if _, ok := linker.symMap[reloc.Sym.Name]; ok {
reloc.Sym = linker.symMap[reloc.Sym.Name]
} else {
if strings.HasPrefix(reloc.Sym.Name, constants.TypeImportPathPrefix) {
path := strings.Trim(strings.TrimPrefix(reloc.Sym.Name, constants.TypeImportPathPrefix), ".")
reloc.Sym.Kind = symkind.SNOPTRDATA
reloc.Sym.Offset = len(linker.noptrdata)
Expand All @@ -232,24 +227,20 @@ func (linker *Linker) addSymbol(name string) (symbol *obj.Sym, err error) {
linker.noptrdata = append(linker.noptrdata, ZeroByte)
bytearrayAlign(&linker.noptrbss, PtrSize)
}
}
if ispreprocesssymbol(reloc.Sym.Name) {
bytes := make([]byte, UInt64Size)
if err := preprocesssymbol(linker.Arch.ByteOrder, reloc.Sym.Name, bytes); err != nil {
return nil, err
} else {
if exist {
reloc.Sym = linker.symMap[reloc.Sym.Name]
if ispreprocesssymbol(reloc.Sym.Name) {
bytes := make([]byte, UInt64Size)
if err := preprocesssymbol(linker.Arch.ByteOrder, reloc.Sym.Name, bytes); err != nil {
return nil, err
} else {
reloc.Sym.Kind = symkind.SNOPTRDATA
reloc.Sym.Offset = len(linker.noptrdata)
linker.noptrdata = append(linker.noptrdata, bytes...)
bytearrayAlign(&linker.noptrbss, PtrSize)
}
}
}
if !exist && loc.Size > 0 {
linker.symMap[reloc.Sym.Name] = reloc.Sym
if reloc.Sym.Name != EmptyString {
linker.symMap[reloc.Sym.Name] = reloc.Sym
}
}
}
symbol.Reloc = append(symbol.Reloc, reloc)
Expand Down
64 changes: 32 additions & 32 deletions relocate.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,43 +25,43 @@ const (
)

func expandFunc(linker *Linker, objsym *obj.ObjSymbol, symbol *obj.Sym) {
// on linux/amd64, mmap force return < 32bit address, don't need add extra instructions
if linker.Arch.Name == sys.ArchAMD64.Name && runtime.GOOS == "linux" {
return
}
// Pessimistically pad the function text with extra bytes for any relocations which might add extra
// instructions at the end in the case of a 32 bit overflow. These epilogue PCs need to be added to
// the PCData, PCLine, PCFile, PCSP etc.

// on linux/amd64, mmap force return < 32bit address, don't need add extra instructions
if !(linker.Arch.Name == sys.ArchAMD64.Name && runtime.GOOS == "linux") {
for i, reloc := range objsym.Reloc {
epilogue := &(objsym.Reloc[i].Epilogue)
epilogue.Offset = len(linker.code) - symbol.Offset
switch reloc.Type {
case reloctype.R_ADDRARM64:
epilogue.Size = maxExtraCodeSize_ADDRARM64
case reloctype.R_CALLARM64:
epilogue.Size = maxExtraCodeSize_CALLARM64
case reloctype.R_ARM64_PCREL_LDST8, reloctype.R_ARM64_PCREL_LDST16, reloctype.R_ARM64_PCREL_LDST32, reloctype.R_ARM64_PCREL_LDST64:
epilogue.Size = maxExtraCodeSize_ARM64_PCREL_LDST
case reloctype.R_CALL:
epilogue.Size = maxExtraCodeSize_CALL
case reloctype.R_PCREL:
opCodes := objsym.Data[reloc.Offset-2 : reloc.Offset+reloc.Size]
switch opCodes[0] {
case x86amd64MOVcode:
epilogue.Size = maxExtraCodeSize_PCRELxMOV
case x86amd64CMPLcode:
epilogue.Size = maxExtraCodeSize_PCRELxCMPL
default:
switch opCodes[1] {
case x86amd64CALLcode:
epilogue.Size = maxExtraCodeSize_PCRELxCALL
case x86amd64JMPcode:
epilogue.Size = maxExtraCodeSize_PCRELxJMP
}
for i, reloc := range objsym.Reloc {
epilogue := &(objsym.Reloc[i].Epilogue)
epilogue.Offset = len(linker.code) - symbol.Offset
switch reloc.Type {
case reloctype.R_ADDRARM64:
epilogue.Size = maxExtraCodeSize_ADDRARM64
case reloctype.R_CALLARM64:
epilogue.Size = maxExtraCodeSize_CALLARM64
case reloctype.R_ARM64_PCREL_LDST8, reloctype.R_ARM64_PCREL_LDST16, reloctype.R_ARM64_PCREL_LDST32, reloctype.R_ARM64_PCREL_LDST64:
epilogue.Size = maxExtraCodeSize_ARM64_PCREL_LDST
case reloctype.R_CALL:
epilogue.Size = maxExtraCodeSize_CALL
case reloctype.R_PCREL:
opCodes := objsym.Data[reloc.Offset-2 : reloc.Offset+reloc.Size]
switch opCodes[0] {
case x86amd64MOVcode:
epilogue.Size = maxExtraCodeSize_PCRELxMOV
case x86amd64CMPLcode:
epilogue.Size = maxExtraCodeSize_PCRELxCMPL
default:
switch opCodes[1] {
case x86amd64CALLcode:
epilogue.Size = maxExtraCodeSize_PCRELxCALL
case x86amd64JMPcode:
epilogue.Size = maxExtraCodeSize_PCRELxJMP
}
}
if epilogue.Size > 0 {
linker.code = append(linker.code, createArchNops(linker.Arch, epilogue.Size)...)
}
}
if epilogue.Size > 0 {
linker.code = append(linker.code, createArchNops(linker.Arch, epilogue.Size)...)
}
}
}
Expand Down

0 comments on commit a829246

Please sign in to comment.