diff options
Diffstat (limited to 'src/util/fipstools/delocate/delocate.go')
-rw-r--r-- | src/util/fipstools/delocate/delocate.go | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/util/fipstools/delocate/delocate.go b/src/util/fipstools/delocate/delocate.go index 8e0e508..cd08bed 100644 --- a/src/util/fipstools/delocate/delocate.go +++ b/src/util/fipstools/delocate/delocate.go @@ -1163,6 +1163,22 @@ Args: args = append(args, argStr) + case ruleGOTAddress: + if instructionName != "leaq" { + return nil, fmt.Errorf("_GLOBAL_OFFSET_TABLE_ used outside of lea") + } + if i != 0 || len(argNodes) != 2 { + return nil, fmt.Errorf("Load of _GLOBAL_OFFSET_TABLE_ address didn't have expected form") + } + d.gotDeltaNeeded = true + changed = true + targetReg := d.contents(argNodes[1]) + args = append(args, ".Lboringssl_got_delta(%rip)") + wrappers = append(wrappers, func(k func()) { + k() + d.output.WriteString(fmt.Sprintf("\taddq .Lboringssl_got_delta(%%rip), %s\n", targetReg)) + }) + case ruleGOTLocation: if instructionName != "movabsq" { return nil, fmt.Errorf("_GLOBAL_OFFSET_TABLE_ lookup didn't use movabsq") |