Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 20 Mar 2004 17:45:04 -0500
From:      Garance A Drosihn <drosih@rpi.edu>
To:        hackers@FreeBSD.org
Subject:   Adventures with gcc: code vs object-code size
Message-ID:  <p0602044cbc827481888c@[128.113.24.47]>

next in thread | raw e-mail | index | archive | help
I have written a fairly major set of changes to the `ps' command,
which is available as:
http://people.freebsd.org/~gad/ps-susv3.diff

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];
	    ...do 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.

-- 
Garance Alistair Drosehn            =   gad@gilead.netel.rpi.edu
Senior Systems Programmer           or  gad@freebsd.org
Rensselaer Polytechnic Institute    or  drosih@rpi.edu



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?p0602044cbc827481888c>