Skip to content

cmd/pprof: disassembly support for PIE binaries / shared libraries #46639

@prattmic

Description

@prattmic

go tool pprof does not support disassembly of position independent code (PIE binaries or shared libraries). Notably, on Windows PIE is default, so disassembly doesn't work by default:

gopher@SERVER-2016-V7- c:\workdir>go\bin\go build cpu.go                                                                        
                                                                                                                                             
gopher@SERVER-2016-V7- c:\workdir>cpu.exe -output cpu.pprof                                                                      
                                                                                                                                             
gopher@SERVER-2016-V7- c:\workdir>pprof.exe -top cpu.exe cpu.pprof                                                               
File: cpu.exe                                                                                                                   
Type: cpu                                                                                                                       
Time: Jun 7, 2021 at 9:19pm (GMT)                                                                                               
Duration: 1.11s, Total samples = 990ms (89.48%)                                                                                  
Showing nodes accounting for 990ms, 100% of 990ms total                                                                         
      flat  flat%   sum%        cum   cum%                                                                                      
     330ms 33.33% 33.33%      840ms 84.85%  time.Since                                                                           
     280ms 28.28% 61.62%      280ms 28.28%  time.Time.Sub                                                                        
     150ms 15.15% 76.77%      990ms   100%  main.main                                                                            
     130ms 13.13% 89.90%      130ms 13.13%  runtime.nanotime1                                                                   
     100ms 10.10%   100%      230ms 23.23%  runtime.nanotime                                                                     
         0     0%   100%      990ms   100%  runtime.main                                                                         
                                                                                                                                             
gopher@SERVER-2016-V7- c:\workdir>pprof.exe -disasm . cpu.exe cpu.pprof     
Total: 990ms   

Without PIE:

gopher@SERVER-2016-V7- c:\workdir>go\bin\go build -buildmode=exe cpu.go                                                                        
                                                                                                                                             
gopher@SERVER-2016-V7- c:\workdir>cpu.exe -output cpu.pprof                                                                      
                                                                                                                                             
gopher@SERVER-2016-V7- c:\workdir>pprof.exe -disasm . cpu.exe cpu.pprof    
Total: 990ms      
ROUTINE ======================== time.Time.Sub                                                                                   
     310ms      310ms (flat, cum) 31.31% of Total                                                                               
...

Upstream pprof's binutils backend supports base address computation to handle position independent code, but our implementation skips that entirely.

The "binutils" implementation doesn't actually seem particularly specific to binutils, so it would likely not be too difficult to support in our implementation.

cc @cherrymui @mknyszek

Metadata

Metadata

Assignees

No one assigned

    Labels

    NeedsFixThe path to resolution is known, but the work has not been done.compiler/runtimeIssues related to the Go compiler and/or runtime.

    Type

    No type

    Projects

    Status

    Todo

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions