|
@@ -201,40 +201,57 @@ func TestDisasm(t *testing.T) {
|
201
|
201
|
|
202
|
202
|
func TestObjFile(t *testing.T) {
|
203
|
203
|
skipUnlessLinuxAmd64(t)
|
204
|
|
- bu := &Binutils{}
|
205
|
|
- f, err := bu.Open(filepath.Join("testdata", "hello"), 0, math.MaxUint64, 0)
|
206
|
|
- if err != nil {
|
207
|
|
- t.Fatalf("Open: unexpected error %v", err)
|
208
|
|
- }
|
209
|
|
- defer f.Close()
|
210
|
|
- syms, err := f.Symbols(regexp.MustCompile("main"), 0)
|
211
|
|
- if err != nil {
|
212
|
|
- t.Fatalf("Symbols: unexpected error %v", err)
|
213
|
|
- }
|
|
204
|
+ for _, tc := range []struct {
|
|
205
|
+ desc string
|
|
206
|
+ start, limit, offset uint64
|
|
207
|
+ addr uint64
|
|
208
|
+ }{
|
|
209
|
+ {"fake mapping", 0, math.MaxUint64, 0, 0x40052d},
|
|
210
|
+ {"fixed load address", 0x400000, 0x4006fc, 0, 0x40052d},
|
|
211
|
+ // True user-mode ASLR binaries are ET_DYN rather than ET_EXEC so this case
|
|
212
|
+ // is a bit artificial except that it approximates the
|
|
213
|
+ // vmlinux-with-kernel-ASLR case where the binary *is* ET_EXEC.
|
|
214
|
+ {"simulated ASLR address", 0x500000, 0x5006fc, 0, 0x50052d},
|
|
215
|
+ } {
|
|
216
|
+ t.Run(tc.desc, func(t *testing.T) {
|
|
217
|
+ bu := &Binutils{}
|
|
218
|
+ f, err := bu.Open(filepath.Join("testdata", "hello"), tc.start, tc.limit, tc.offset)
|
|
219
|
+ if err != nil {
|
|
220
|
+ t.Fatalf("Open: unexpected error %v", err)
|
|
221
|
+ }
|
|
222
|
+ defer f.Close()
|
|
223
|
+ syms, err := f.Symbols(regexp.MustCompile("main"), 0)
|
|
224
|
+ if err != nil {
|
|
225
|
+ t.Fatalf("Symbols: unexpected error %v", err)
|
|
226
|
+ }
|
214
|
227
|
|
215
|
|
- find := func(name string) *plugin.Sym {
|
216
|
|
- for _, s := range syms {
|
217
|
|
- for _, n := range s.Name {
|
218
|
|
- if n == name {
|
219
|
|
- return s
|
|
228
|
+ find := func(name string) *plugin.Sym {
|
|
229
|
+ for _, s := range syms {
|
|
230
|
+ for _, n := range s.Name {
|
|
231
|
+ if n == name {
|
|
232
|
+ return s
|
|
233
|
+ }
|
|
234
|
+ }
|
220
|
235
|
}
|
|
236
|
+ return nil
|
221
|
237
|
}
|
222
|
|
- }
|
223
|
|
- return nil
|
224
|
|
- }
|
225
|
|
- m := find("main")
|
226
|
|
- if m == nil {
|
227
|
|
- t.Fatalf("Symbols: did not find main")
|
228
|
|
- }
|
229
|
|
- frames, err := f.SourceLine(m.Start)
|
230
|
|
- if err != nil {
|
231
|
|
- t.Fatalf("SourceLine: unexpected error %v", err)
|
232
|
|
- }
|
233
|
|
- expect := []plugin.Frame{
|
234
|
|
- {Func: "main", File: "/tmp/hello.c", Line: 3},
|
235
|
|
- }
|
236
|
|
- if !reflect.DeepEqual(frames, expect) {
|
237
|
|
- t.Fatalf("SourceLine for main: expect %v; got %v\n", expect, frames)
|
|
238
|
+ m := find("main")
|
|
239
|
+ if m == nil {
|
|
240
|
+ t.Fatalf("Symbols: did not find main")
|
|
241
|
+ }
|
|
242
|
+ for _, addr := range []uint64{m.Start + f.Base(), tc.addr} {
|
|
243
|
+ gotFrames, err := f.SourceLine(addr)
|
|
244
|
+ if err != nil {
|
|
245
|
+ t.Fatalf("SourceLine: unexpected error %v", err)
|
|
246
|
+ }
|
|
247
|
+ wantFrames := []plugin.Frame{
|
|
248
|
+ {Func: "main", File: "/tmp/hello.c", Line: 3},
|
|
249
|
+ }
|
|
250
|
+ if !reflect.DeepEqual(gotFrames, wantFrames) {
|
|
251
|
+ t.Fatalf("SourceLine for main: got %v; want %v\n", gotFrames, wantFrames)
|
|
252
|
+ }
|
|
253
|
+ }
|
|
254
|
+ })
|
238
|
255
|
}
|
239
|
256
|
}
|
240
|
257
|
|