Live data from Hacker News

My Go executable files are still getting larger

cockroachlabs.com

1–10 of 174 posts

Re: My Go executable files are still getting larger

#3
I always wonder if this is the flip side of the fast compilation?

It would be nice to be able to decide on those trade-offs ourselves. I mostly write web servers in Go, which (as the article says) are executed rarely, so init time really doesn't matter to me. But I've been looking at writing some desktop apps in Go, and then init time will matter.

Re: My Go executable files are still getting larger

#4
It's time for debug info like this to be sent to "onlinesymbolserver.com", encrypted with a hash of the binary.

Then, whenever a debugger connects to a binary, it can simply download the symbols as required.

And for the 99.9% who don't need debug info, it isn't needlessly shipped.

Microsoft invented this in the 90's...

Re: My Go executable files are still getting larger

#6
post #2

Is there a bug report for this?

Probably falls under the umbrella issue filed by Rob Pike… back in 2013[1]. But that's the umbrella issue, and it's probably better for the Cockroach people to file a new one mentioning their findings, but don't quote me on that.

[1]: https://github.com/golang/go/issues/6853

Re: My Go executable files are still getting larger

#7
> The sum of the sizes reported by go tool nm does not add up to the final size of the Go executable.

> At this time, I do not have a satisfying explanation for this “dark” file usage.

The author's journey of starting with "nm --size", discovering "dark" bytes, and wanting to attribute them properly, is exactly what led me to create and invest so much effort into Bloaty McBloatface: https://github.com/google/bloaty

Bloaty's core principle is that every byte of the file should be attributed to something, so that the sum of the parts always adds up to the total file size. If we can't get detailed symbol, etc. information for a given region of the file, we can at least fall back to describing what section the bytes were in.

Attributing all of the bytes requires parsing much more than just the symbol table. Bloaty parses many different sections of the binary, including unwind information, relocation information, debug info, and the data section itself in an attempt to attribute every part of the binary to the function/data that emitted it. It will even disassemble the binary looking for references to anonymous data (some data won't make it into the symbol table, especially things like string literals).

I wrote up some details of how Bloaty works here: https://github.com/google/bloaty/blob/master/doc/how-bloaty-.... The section on the "Symbols" data source is particularly relevant here:

> I excerpted two symbols from the report. Between these two symbols, Bloaty has found seven distinct kinds of data that contributed to these two symbols. If you wrote a tool that naively just parsed the symbol table, you would only find the first of these seven:"

The author's contention that these "dark" bytes are "non-useful" is not quite fair. There are plenty of things a binary contains that are useful even though they are not literally executable code. For example, making a binary position-independent (which is good for security) requires emitting relocations into the binary so that globals with pointer values can be relocated at program load time, once the base address of the binary is chosen. I don't know if Go does this or not, but it's just one example.

On the other hand, I do agree that the ability to produce slim binaries is an important and often undervalued property of modern compiler toolchains. All else being equal, I much prefer a toolchain that can make the smallest binaries.

Bloaty should work reasonably well for Go binaries, though I have gotten some bug reports about things Bloaty is not yet handling properly for Go: https://github.com/google/bloaty/issues/204 Bloaty is just a side thing for me, so I often don't get as much time as I'd like to fix bugs like this.

Re: My Go executable files are still getting larger

#8
Great blog! Thanks for sharing this blog.

Today's market is based on mobile users, Developing a mobile application helps businesses in covering a larger market segment. We are the best mobile app development company that thinks out of the box and build award-winning mobile applications globally.

Our mobile development team is capable of handling applications for such a market base and our expertise in building custom apps, sports, iOS apps, android apps which helps the clients to put their idea into a digital process,

To build a mobile application https://www.sciflare.com/android-application-development/

Re: My Go executable files are still getting larger

#9
> In other words, the Go team decided to make executable files larger to save up on initialization time.

I mean... Im genuinely curious if this is a "we have extra engineering resources and can explore/complain about this" or "we have a client who is running cockroachdb and can't handle a 172mb binary install for a database server".

Is there really someone out there who installs Cockroach (a global distributed auto-sharded database) and thinks twice about 172mb of disk space?

Sure, it'd be nice to have smaller binaries but outside of some embedded applications Go's binaries sizes are well within the nothing-burger range for most compute systems.

Post reply on HN