Adventures with gcc: code vs object-code size

Matt Emmerton matt at
Sat Mar 20 23:23:28 PST 2004

----- Original Message ----- 
From: "Garance A Drosihn" <drosih at>
To: <hackers at>
Sent: Saturday, March 20, 2004 5:45 PM
Subject: Adventures with gcc: code vs object-code size

> I have written a fairly major set of changes to the `ps' command,
> which is available as:
> Debate/discussion about the changes themselves actual changes should
> be going on in the freebsd-standards mailing list.  So for purposes
> of this mailing list, please ignore most of that.
> But while doing it, I was somewhat obsessed about making sure that
> my changes wouldn't cause a dramatic increase in the size of the
> executable for `ps'.  Due to that, I tripped over one example of
> "code" vs "object-code produced" which makes no sense to me.  So,
> consider just this section of the update (with some reformatting
> so it is easy to see the code):
> char elemcopy[PATH_MAX];
> stuff...
> #if !defined(ADD_PS_LISTRESET)
> inf->addelem(inf, elemcopy);
> #else
> /*
> * We now have a single element.  Add it to the
> * list, unless the element is ":".  In that case,
> * reset the list so previous entries are ignored.
> */
> if (strcmp(elemcopy, ":") == 0)
> inf->count = 0;
> else
> inf->addelem(inf, elemcopy);
> #endif
> Now, here is what I noticed:
> * XXX - Adding this check increases the total size of `ps' by
> * 3940 bytes on i386!  That's 12% of the entire program!
> * { using gcc (GCC) 3.3.3 [FreeBSD] 20031106 }
> *
> * When compiling for sparc, adding this option causes NO
> * change in the size of the `ps' executable.  And on alpha,
> * adding this option adds only 8 bytes to the executable.
> So, by adding one call to strcmp() to check for a ":" string, I end
> up with /bin/ps (the stripped-object-file) which has grown by  12.6% !!
> This is for a program which is almost 2500 lines spread out over
> 5 '.c'-files.  How is that possible?  What am I missing here?
> I am not a compilier guru, so I suspect it would take me hours to
> pin this down.  I don't want to do that, so I'm wondering if anyone
> understands how such a minor code-change can POSSIBLY cause such a
> huge change in resulting object file...  I also wonder if this same
> issue pops up in other programs, too.

I don't know why the code bloats so much on i386, but I do question the use
of strcmp() for a single-character compare.
Something like the following would probably be better (and would avoid your

if (elemcopy[0] == ':')
  inf->count = 0;
  inf->addelem(inf, elemcopy);

Matt Emmerton

More information about the freebsd-hackers mailing list