mikrocontroller.net

Forum: Compiler & IDEs avr-g++ bindet ungenutzen code mit ein!


Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

und zwar verwende ich seit neustem den avr-g++ compilier. Was mich nun 
stört ist folgendes und zwar, ich binde mehrere Dateien in mein Projekt 
ein, verwende den darin enthaltenen code aber nicht von allen dateien, 
er compiliert die dinger aber trotzdem mit und das .hex-file wird so 
rießig groß. gibts da ne einstellung wo man ungenutzte ausbinden kann?


Danke,
hans

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achja, optimierungsstufe interessiert ihn auch kein fatzen.

Autor: wurst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>gibts da ne einstellung wo man ungenutzte ausbinden kann?
Beitrag "AVR-GCC Kompiliert nicht benutzte Funktionen mit ein"

>optimierungsstufe interessiert ihn auch kein fatzen.
Sei froh! Dann kannst du auch nichts falsch machen ;)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hans wrote:

> gibts da ne einstellung wo man ungenutzte ausbinden kann?

Ja, die heißt: Mach ein Softwaredesign.  Dann weißt du, was du
eigentlich brauchst, und kannst es dir sparen, den Rest überhaupt
noch aufzuschreiben.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der Option gc-sections kann der Linker die nicht benutzten 
Funktionen herausfiltern. Vorausgesetzt du hast deinen Quellcode mit 
-ffunction-sections und -fdata-sections compiliert.
Für ein C++-Projekt auf einem AVR-Target verwende ich beispielsweise 
folgende Einstellungen für g++:
-Os -gdwarf-2 -Wall -c -mmcu=atmega328p  -mno-tablejump -mcall-prologues -fmessage-length=0 -fshort-enums -fno-rtti -fno-exceptions -ffunction-sections  -fdata-sections
Für den Linker-Pass über das gcc-Frontend folgende Optionen:
-mmcu=atmega328p -static -Wl,--relax -Wl,--gc-sections

Anmerkungen:
Bei -fno-tablejumps musst du experimentieren, ob's was bringt.
Die --relax Option sorgt dafür, dass der Linker absolute Sprünge durch 
relative Sprünge die 1 Byte weniger brauchen, ersetzt. Hat bei mir 
nochmals ca. 500 Bytes gespart.

Achja: Ich verwende den GCC 4.2.2

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die --relax Option sorgt dafür, dass der Linker absolute Sprünge durch
>relative Sprünge die 1 Byte weniger brauchen, ersetzt. Hat bei mir
>nochmals ca. 500 Bytes gespart.

Goil! Das --relax bringt bei einigen meiner C
Programme auch noch mal bis zu 400 freie Bytes.
Programmgröße ungefähr 10kB Flash Bedarf.

Wieso muss man solche Optionen eigentlich erst im Forum
finden? Warum sind die nicht "DEFAULT"?

Ok, Programm hab ich damit noch nicht ausprobiert.
Nur compiliert.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es einen guten Grund, dass Du g++ statt gcc verwendest?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
g++, weil er vielleicht in C++ programmiert? Ist doch kein Verbrechen, 
oder?

Autor: DerDan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


wenn ich
-ffunction-sections
und
-Wl,--gc-sections

verwende, dann erzeugt der linker ein leers file

und es kommt die Meldung:
avr-objcopy: there are no sections to be copied!

ich verwende ein eigenes Linker Script. Wenn ich das nicht angebe, dann
wird ein File generiert.

also muss ich etwas in meinem Linker Script ändern. Nur was?
OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")
OUTPUT_ARCH(avr:4)
MEMORY
{
  text   (rx)   : ORIGIN = 0, LENGTH = 16K - 2k - 128
  text2  (rx)   : ORIGIN = 16K - 2K - 128,  LENGTH = 128
  data   (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0
  eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 512
}
SECTIONS
{
  /* Read-only sections, merged into text segment: */
  .hash          : { *(.hash)    }
  .dynsym        : { *(.dynsym)    }
  .dynstr        : { *(.dynstr)    }
  .gnu.version   : { *(.gnu.version)  }
  .gnu.version_d   : { *(.gnu.version_d)  }
  .gnu.version_r   : { *(.gnu.version_r)  }
  .rel.init      : { *(.rel.init)    }
  .rela.init     : { *(.rela.init)  }
  .rel.text      :
    {
      *(.rel.text)
      *(.rel.text.*)
      *(.rel.gnu.linkonce.t*)
    }
  .rela.text     :
    {
      *(.rela.text)
      *(.rela.text.*)
      *(.rela.gnu.linkonce.t*)
    }
  .rel.fini      : { *(.rel.fini)    }
  .rela.fini     : { *(.rela.fini)  }
  .rel.rodata    :
    {
      *(.rel.rodata)
      *(.rel.rodata.*)
      *(.rel.gnu.linkonce.r*)
    }
  .rela.rodata   :
    {
      *(.rela.rodata)
      *(.rela.rodata.*)
      *(.rela.gnu.linkonce.r*)
    }
  .rel.data      :
    {
      *(.rel.data)
      *(.rel.data.*)
      *(.rel.gnu.linkonce.d*)
    }
  .rela.data     :
    {
      *(.rela.data)
      *(.rela.data.*)
      *(.rela.gnu.linkonce.d*)
    }
  .rel.ctors     : { *(.rel.ctors)  }
  .rela.ctors    : { *(.rela.ctors)  }
  .rel.dtors     : { *(.rel.dtors)  }
  .rela.dtors    : { *(.rela.dtors)  }
  .rel.got       : { *(.rel.got)    }
  .rela.got      : { *(.rela.got)    }
  .rel.bss       : { *(.rel.bss)    }
  .rela.bss      : { *(.rela.bss)    }
  .rel.plt       : { *(.rel.plt)    }
  .rela.plt      : { *(.rela.plt)    }
  /* Internal text space or external memory */
  .text :
  {
    __vectors_update0 = absolute (16k  - 2k);
    *(.vectors)
    /*
    *(.version)
    *(.device)
    */
     __ctors_start = . ;
     *(.ctors)
     __ctors_end = . ;
     __dtors_start = . ;
     *(.dtors)
     __dtors_end = . ;
    *(.progmem.gcc*)
    *(.progmem*)
    . = ALIGN(2);
    *(.init0)  /* Start here after reset.  */
    *(.init1)
    *(.init2)  /* Clear __zero_reg__, set up stack pointer.  */
    *(.init3)
    *(.init4)  /* Initialize data and BSS.  */
    *(.init5)
    *(.init6)  /* C++ constructors.  */
    *(.init7)
    *(.init8)
    *(.init9)  /* Call main().  */
    *(.text)
    . = ALIGN(2);
    *(.text.*)
    . = ALIGN(2);
    *(.fini9)  /* _exit() starts here.  */
    *(.fini8)
    *(.fini7)
    *(.fini6)  /* C++ destructors.  */
    *(.fini5)
    *(.fini4)
    *(.fini3)
    *(.fini2)
    *(.fini1)
    *(.fini0)  /* Infinite loop after program termination.  */
     _etext = . ;
  }  > text
  .data    : AT (ADDR (.text) + SIZEOF (.text))
  {
     PROVIDE (__data_start = .) ;
    *(.data)
    *(.gnu.linkonce.d*)
    . = ALIGN(2);
     _edata = . ;
     PROVIDE (__data_end = .) ;
  }  > data
  .text2 :
  {
    *(.signature)
  } > text2
  .bss  SIZEOF(.data) + ADDR(.data) :
  {
     PROVIDE (__bss_start = .) ;
    *(.bss)
    *(COMMON)
     PROVIDE (__bss_end = .) ;
  }  > data
   __data_load_start = LOADADDR(.data);
   __data_load_end = __data_load_start + SIZEOF(.data);
  /* Global data not cleared after reset.  */
  .noinit  SIZEOF(.bss) + ADDR(.bss) :
  {
     PROVIDE (__noinit_start = .) ;
    *(.noinit*)
     PROVIDE (__noinit_end = .) ;
     _end = . ;
     PROVIDE (__heap_start = .) ;
  }  > data
  .eeprom  :
  {
    *(.eeprom*)
     __eeprom_end = . ;
  }  > eeprom
  /* Stabs debugging sections.  */
  .stab 0 : { *(.stab) }
  .stabstr 0 : { *(.stabstr) }
  .stab.excl 0 : { *(.stab.excl) }
  .stab.exclstr 0 : { *(.stab.exclstr) }
  .stab.index 0 : { *(.stab.index) }
  .stab.indexstr 0 : { *(.stab.indexstr) }
  .comment 0 : { *(.comment) }
  /* DWARF debug sections.
     Symbols in the DWARF debugging sections are relative to the beginning
     of the section so we begin them at 0.  */
  /* DWARF 1 */
  .debug          0 : { *(.debug) }
  .line           0 : { *(.line) }
  /* GNU DWARF 1 extensions */
  .debug_srcinfo  0 : { *(.debug_srcinfo) }
  .debug_sfnames  0 : { *(.debug_sfnames) }
  /* DWARF 1.1 and DWARF 2 */
  .debug_aranges  0 : { *(.debug_aranges) }
  .debug_pubnames 0 : { *(.debug_pubnames) }
  /* DWARF 2 */
  .debug_info     0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }
  .debug_abbrev   0 : { *(.debug_abbrev) }
  .debug_line     0 : { *(.debug_line) }
  .debug_frame    0 : { *(.debug_frame) }
  .debug_str      0 : { *(.debug_str) }
  .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }
}

Autor: Werkann Derkann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehe in meinen Mapfiles die Section *(.text.*), die in deinem 
Linkerscript zu fehlen scheint. Vielleicht ist das die Erkärung?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.