[mc1322x] linking in math libraries?
Andrew Pullin
pullin at berkeley.edu
Thu Apr 8 03:00:49 EDT 2010
On 4/7/2010 2:37 PM, Mariano Alvira wrote:
> On Wed, Apr 07, 2010 at 01:05:13PM -0700, Andrew Pullin wrote:
>
>> I just got some RedBee hardware and am familiarizing myself with ARM
>> programming. I've been using the libmc1322x project codebase, just because all
>> the startup code is already there for the RedBee boards.
>>
>> I've noticed that if I #include<math.h> , and add -lm to the makefile, it makes
>> the executable really large, about 500K if sqrt() is used. I know it has to
>> include a fair bit of code for software floating point support, but that seems
>> like a lot. My only point of reference is for the MSP430, where including
>> software floats is ~10K of compiled code from msp430libc.
>>
>> Is there something I am just overlooking? I know that floating point math will
>> be slow, and I should learn fixed pointed properly, but I'm still interested to
>> figure this out.
>>
>>
>>
>> -Andrew
>>
>>
> At the end is a patch that solves this for sqrt(). Using dot2map.pl
> and looking at the .map itself, I was able to determine: 1) which
> .o were pulling in big trees, and 2) which functions in that trouble
> object were getting called.
>
> Those were __assert_fail, fputs, fwrite, and stderr.
>
> I tested this on printf.c. Our printf doesn't have %f, but you can
> convince youself that it's working right.
>
> -Mar.
>
> diff --git a/Makefile.include b/Makefile.include
> index 885e4a2..fc0ac62 100644
> --- a/Makefile.include
> +++ b/Makefile.include
> @@ -76,7 +76,7 @@ $(MC1322X)/src/src.a: $(MC1322X)/src/src.a($(SRCOBJS))
>
> %_$(BOARD).elf: $(OBJDIR)/%.o $(START) $(ISR) $(SRCOBJS) $(LINKERSCRIPT) $(LIBMC1322X)/libmc1322x.a $(OBJDIR)/board.a $(MC1322X)/src/src.a
> $(CC) $(LDFLAGS) \
> - -L $(LIBMC1322X) -L $(MC1322X)/src -L $(OBJDIR) $< -o $@ $(START) $(MC1322X)/src/src.a --start-group $(OBJDIR)/board.a $(LIBMC1322X)/libmc1322x.a --end-group
> + -L $(LIBMC1322X) -L $(MC1322X)/src -L $(OBJDIR) $< -o $@ $(START) $(MC1322X)/src/src.a --start-group $(OBJDIR)/board.a $(LIBMC1322X)/libmc1322x.a -lm --end-group
>
> %.srec: %.elf
> $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
> diff --git a/tests/printf.c b/tests/printf.c
> index 0d43f06..d09af1d 100644
> --- a/tests/printf.c
> +++ b/tests/printf.c
> @@ -2,6 +2,7 @@
> #include<board.h>
>
> #include<stdio.h>
> +#include<math.h>
>
> #include "tests.h"
> #include "config.h"
> @@ -11,7 +12,22 @@
> printf(#x); \
> printf("): %d\n", sizeof(x)); \
> } while(0)
> -
> +
> +FILE *stderr;
> +
> +void __assert_fail(void) {
> + return;
> +}
> +
> +int fputs(const char *s, FILE *stream) {
> + return 0;
> +}
> +
> +size_t fwrite(const void *ptr, size_t size, size_t nmemb,
> + FILE *stream) {
> + return 0;
> +}
> +
> int main(void)
> {
> char *ptr = "Hello world!";
> @@ -45,6 +61,9 @@ int main(void)
> printf("%d %s(s)", 0, "message");
> printf("\n");
> printf("%d %s(s) with %%\n", 0, "message");
> +
> + printf("sqrt(5) * 100 = %d\n", (int) (sqrt(5)*100));
> +
> // sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf);
> // sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf);
> // sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf);
>
Well, that seems to work properly. Would newlib solve this & other
problems? newlib-1.16 seems to build with the OpenEmbedded toolchain if
you link arm-elf-* to arm-linux-* , although I don't know where to
install it or how to link against it. I'm no compiler expert!
Along the same lines, is there an accepted way of building a more
minimal toolchain? OE works great, but it seems to be more targeted to
linux development; lots and lots and packages to build. There are
instructions at http://www.gnuarm.org/support.html that will results in
a compiler that seems to have problems with
"-mcallee-super-interworking" when building the libmc1322x tests.
-Andrew
More information about the mc1322x
mailing list