GCC pod arm'a (LPC2106) linkowanie mniejszego kodu

May 10, 2007 11 Replies

Witam uzywam arm-elf-gcc oraz arm-elf-ld (wersja 3.4.3 oraz 2.15). Procek armowy LPC2106 Philis'a.



Daze do zmniejszenia ilosci kodu chcac wyrzucic z pliku wynikowego (elf albo hex) funkcje ktore pomimo ze zdefiniowano w plikach *.c nie sa uzywane w programie.



Projekt sklada sie z 3 plikow main.c a.c b.c. Kompliluje z opcja "-ffunction-sections" aby kompilator w plikach *.o umiescil informacje o uzyciu poszczegolnych funkcji tzw garbage collection:



arm-elf-gcc $(DIRS) O2 -ffunction-sections -mcpu=arm7tdmi -Wall -c -fmessage-length=0 -o$@ $<



Linkuje z opcja linkera "--gc-sections" (garbage collection sections) aby zebral infomracje ktore funkcje sa nieuzywane:



arm-elf-ld $(DIRS) --gc-sections -Tlpc2106.ld -o $(UTPUTS) $(LINK_OBJS) $(LIBS)



Jeszcze zamieniam elf'a na hex'a :



arm-elf-objcopy -O ihex $(ELFOUTPUT) $(HEXOUTPUT) >> $(STROUTPUT)



Jednak wielkosc pliku hex wynosi 13 bajtow! pomimo ze powinno byc duzo wiecej - fukcja main wywoluje inne funckje i uzywam przerwan....



PS znalazlem informacje na:

formatting link
ale nie pomaga:(



Ktos moze pomoc? szukalem na google bez skutku. Dziekuje



Thus wrote tp.net.pl <wytnijto snipped-for-privacy@tlen.pl:

Zamiast tak cudować: - umieść każdą funkcję w osobnym pliku *.c - zrób z nich bibliotekę (*.a) - przy linkowaniu biblioteki włączane są tylko używane moduły

Paweł

dodaj do pliku linkera: KEEP(startup)

startup zamien na nazwe sekcji, w ktorej masz kod startowy

Jesli nie pomoze, to podeslij plik konfiguracyjny linkera.

Pozdr AK

U¿ytkownik "Pawe³ Wiêcek" snipped-for-privacy@vmh.net napisa³ w wiadomo¶ci news: snipped-for-privacy@lilith.rlyeh.org...

Dzieki Pawel ale o tym wiem rozbieranie moich modulow na pojedyncze pliki to "mordega":)

U¿ytkownik "AK" snipped-for-privacy@gazeta.pl napisa³ w wiadomo¶ci news:f201hv$7r5$ snipped-for-privacy@inews.gazeta.pl...

Wlasnie tego mi brakowalo tylko nie wiedzialem jak w gcc to zrobic... Grejt to dziala!

PS. Dziekuje AK kod sie zmniejszyl o polowe:) Jeszcze sprawdze czy program pracuje jak nalezy. Swoja droga do tej pory uzywalem IAR i tam wymuszalem linkowanie modulu startowego startup.s linia SEGMENT.

Tego do konca nie rozumiem ale skoro juz mi dziala...

U¿ytkownik "AK" snipped-for-privacy@gazeta.pl napisa³ w wiadomo¶ci news:f201hv$7r5$ snipped-for-privacy@inews.gazeta.pl...

Aha jeszce jedno - program zminimalizowalem do funkcji main() z funkcja z biblioteki A.a: main() { a(); }

w linkerze linkuje biblioteke A.a wynikowy hex ma wielkosc rowna bibliotece

32kB (w pliku *.map widze ze jakby zlinkowal cala bilioteke!).

Jesli w main(){} nie wywoluje nic jest ok -> hex ma ok 4KB.

U¿ytkownik "Pawe³ Wiêcek" snipped-for-privacy@vmh.net napisa³ w wiadomo¶ci news: snipped-for-privacy@lilith.rlyeh.org...

I to mnie wlasnie mierzi w tym GCC a nie powinno byc tak jak w VisualC? Tzn z bilioteki statycznej wyciagane sa funckje o ile sie orientuje...:)

Przykladowo dodaje biblioteke do prostego programu ktory wazy 1KB , uzywam w programie jednej fukcji bibliotecznej ktora nie odwoluje sie juz do innych w tej bibliotece a tu kod rosnie do 32KB+1KB poniewaz biblioteka miala 32KB...

In the darkest hour on Fri, 11 May 2007 08:59:30 +0200, tp.net.pl <wytnijto snipped-for-privacy@tlen.pl screamed:

Pliki .a to właśnie "biblioteki statyczne". I tak właśnie jest. A tworzenie ich to nie mordęga tylko dodanie dwóch prostych poleceń: ar i ranlib.

U¿ytkownik "Artur M. Piwko" snipped-for-privacy@pu.kielce.pl> napisa³ w wiadomo¶ci news: snipped-for-privacy@beast.tu.kielce.pl...

Dzieki ale chodzilo mi nie o tworzenie biblioteki *.a czyli archiwum , tylko podzielenie pliku *.c na pojedyncze pliki kazdy z jedna funkcja...

Thus wrote Artur M. Piwko snipped-for-privacy@pu.kielce.pl>:

Jednego... Ranlib zbędny jest.

Paweł

Thus wrote tp.net.pl <wytnijto snipped-for-privacy@tlen.pl:

Obawiam się, że się źle orientujesz. A na pewno źle cytujesz.

Paweł

buke napisał(a):

Przecież to da się zautomatyzować. Jeżeli wszystkie funkcje nie są statyczne (czyli mają być dostępne z zewnątrz) i już posprzątałeś używanie zmiennych statycznych i deklarację globalnych, to bardzo ładnie automatycznie można wygenerować n plików, z których każdy zawiera początek pliku oryginalnego aż do pierwszej funkcji (komentarze, includy itp) oraz n-tą funkcję i ew. końcówkę pliku po ostatniej funkcji (komentarze).

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required