Search code examples
goelf

Remove file paths from TEXT directives in go binaries


I want to remove all path information like /Users/myuser/dev/go/src/fooapi/spikes/mongoapi.go from the executable that I created with go build.

I'm compiling the code like this:

CGO_ENABLED=0 go build -v -a -ldflags="-w -s" -o ./fooapi spikes/mongoapi.go

Some part of the example assembly from the go build command above:

$ go tool objdump ./fooapi
.
.
TEXT main.init(SB) /Users/myuser/dev/go/src/api/spikes/mongoapi.go
mongoapi.go:60  0x12768c0   65488b0c25a0080000  GS MOVQ GS:0x8a0, CX
mongoapi.go:60  0x12768c9   483b6110        CMPQ 0x10(CX), SP
mongoapi.go:60  0x12768cd   7663            JBE 0x1276932
.
.

Note that: strip is not recommended and can lead to broken executables if you're going to recommend it as a solution.


Solution

  • Use -trimpath flags to remove path information:

    CGO_ENABLED=0 go build -v -a -ldflags="-w -s" \
        -gcflags=-trimpath=/Users/myuser/dev/go/src \
        -asmflags=-trimpath=/Users/myuser/dev/go/src \
        -o ./fooapi spikes/mongoapi.go
    

    More Information:

    Passing -trimpath to -gcflags and -asmflags will remove any path information from the elf binary.

    $ go tool asm -help 2>&1 | grep -A1 trimpath
    -trimpath string
        remove prefix from recorded source file paths
    
    $ go tool compile -help|grep -A1 trimpath
    -trimpath string
        remove prefix from recorded source file paths
    

    You can check the result with go tool objdump:

    $ go tool objdump ./fooapi
    .
    .
    TEXT main.init(SB) api/spikes/mongoapi.go
    mongoapi.go:60  0x12768c0   65488b0c25a0080000  GS MOVQ GS:0x8a0, CX
    mongoapi.go:60  0x12768c9   483b6110        CMPQ 0x10(CX), SP
    mongoapi.go:60  0x12768cd   7663            JBE 0x1276932
    .
    .
    

    Using strip tool has still some controversies in go community, although it's been said that it's been fixed. Some say that unknown and unpredictable bugs occur sometimes. Read here and here for examples.