реклама на сайте
подробности

 
 
> -ffunction-sections и -fdata-sections, хочу прояснить
demiurg_spb
сообщение Jul 5 2010, 16:31
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Здравствуйте уважаемые любители gcc!
Хочу прояснить один момент.
При:
Код
CFLAGS += -ffunction-sections
CFLAGS += -fdata-sections
LDFLAGS += -Wl,--gc-section
и:
Код
MATH_LIB = -lm
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
и фактически при пустом проекте не выкидывается все эти
неиспользуемые мной библиотечные функции (проект собирается и без этих либ).
Размер выходного файла увеличивается на 2,5КБ.

Объясните пожалуйста кто-нибудь почему?
Может потому, что они (либы) были скомпилены без -ffunction-sections и -fdata-sections?

PS: avr-gcc (WinAVR 20100110) 4.3.3


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
klen
сообщение Jul 5 2010, 17:25
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(demiurg_spb @ Jul 5 2010, 20:31) *
Здравствуйте уважаемые любители gcc!
Хочу прояснить один момент.
При:
Код
CFLAGS += -ffunction-sections
CFLAGS += -fdata-sections
LDFLAGS += -Wl,--gc-section
и:
Код
MATH_LIB = -lm
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
и фактически при пустом проекте не выкидывается все эти
неиспользуемые мной библиотечные функции (проект собирается и без этих либ).
Размер выходного файла увеличивается на 2,5КБ.

Объясните пожалуйста кто-нибудь почему?
Может потому, что они (либы) были скомпилены без -ffunction-sections и -fdata-sections?

PS: avr-gcc (WinAVR 20100110) 4.3.3

скорее всего -lprintf_flt
она собрана с -ffunction-sections?
посмотрите в какие функции лишниие и напишите.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 5 2010, 17:46
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(klen @ Jul 5 2010, 21:25) *
скорее всего -lprintf_flt
она собрана с -ffunction-sections?
как это узнать (собирал ведь её не я)?

Цитата
посмотрите в какие функции лишниие и напишите.
Докладываю:-)
По моему мнению всё это лишнее (кусочек map файла):
Код
.text.avr-libc
                0x00000376      0x6d0 c:/winavr/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libprintf_flt.a(vfprintf_flt.o)
                0x00000376                vfprintf
.text.libgcc   0x00000a46       0x38 c:/winavr/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_prologue.o)
                0x00000a46                __prologue_saves__
.text.libgcc   0x00000a7e       0x36 c:/winavr/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_epilogue.o)
                0x00000a7e                __epilogue_restores__
.text.avr-libc
                0x00000ab4      0x1b0 c:/winavr/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(ftoa_engine.o)
                0x00000ab4                __ftoa_engine
.text.avr-libc
                0x00000c64       0x16 c:/winavr/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(strnlen_P.o)
                0x00000c64                strnlen_P
.text.avr-libc
                0x00000c7a       0x16 c:/winavr/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(strnlen.o)
                0x00000c7a                strnlen
.text.avr-libc
                0x00000c90       0x58 c:/winavr/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(fputc.o)
                0x00000c90                fputc
.text.avr-libc
                0x00000ce8       0xbc c:/winavr/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(ultoa_invert.o)
                0x00000ce8                __ultoa_invert

судя по map-файлу либы avr-libc и libgcc собраны без -ffunction-sections

А вообще можно библиотеки собирать с кучей секций, да так чтоб их (секции) потом при подключении либ линкер видел и выкидывал?

PS:Даже можно и без этого
Код
MATH_LIB = -lm
(результаты одинаковые)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 6 2010, 09:42
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(demiurg_spb @ Jul 5 2010, 20:46) *
судя по map-файлу либы avr-libc и libgcc собраны без -ffunction-sections
Насколько понимаю - это не должно влиять. Функции из библиотеки подтягиваются только в том случае, если к ним есть обращение. Надо разобраться - что именно заставляет подтягивать эти функкции из библиотеки.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 7 2010, 08:14
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Сергей Борщ @ Jul 6 2010, 13:42) *
Насколько понимаю - это не должно влиять. Функции из библиотеки подтягиваются только в том случае, если к ним есть обращение. Надо разобраться - что именно заставляет подтягивать эти функкции из библиотеки.
Умом я это тоже понимаю, но проект ведь и без них собирается.
Более того, я не увидел ни одного вызова, из перечисленных мной ранее функций в листинге моей программы. Вот что странно.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 7 2010, 10:49
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Возможно, эти библиотеки используют какие-то статические структуры данных, а функция их инициализации помещена куда-то в секцию .init. Тогда линкер не может всё это хозяйство выкинуть.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
klen
сообщение Jul 7 2010, 15:39
Сообщение #7


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



поробывал своей сборкой.
собираю код состоящий из одного пустого main + 2 функции которые заведомо не используются чтоб проверить -Wl,-gc-sections + -ffunction-sections -fdata-sections.
стотрб листинг - что с -lprintf_flt что без - лишнего кода нет:
Код
#include <string.h>

void b(char *b, char *d, char f)
{
  char count = f;
  do
  {
    *(d++) = *(b++);
  } while ( f-- );
  
}

void cpy ( char* x , char* y , size_t s  )
{
  if ( !s ) return;
  size_t t = s;
  do
   {
     *(y++) = *(x++);
   }
  while( --t );
}

int main ()
{
return 1;
}


на выходе
avr-gcc -mmcu=atmega32 a.c -ggdb3 -Os -lprintf_flt -Wl,-gc-sections -ffunction-sections -fdata-sections
avr-objdump -h -C -S a.out > a.txt

Код
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000009c  00000000  00000000  00000054  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .stab         000006b4  00000000  00000000  000000f0  2**2
                  CONTENTS, READONLY, DEBUGGING
  2 .stabstr      00000067  00000000  00000000  000007a4  2**0
                  CONTENTS, READONLY, DEBUGGING
  3 .debug_aranges 00000030  00000000  00000000  0000080b  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_pubnames 00000029  00000000  00000000  0000083b  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_info   00000106  00000000  00000000  00000864  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_abbrev 000000ac  00000000  00000000  0000096a  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_line   00000129  00000000  00000000  00000a16  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_frame  00000040  00000000  00000000  00000b40  2**2
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_str    0000006a  00000000  00000000  00000b80  2**0
                  CONTENTS, READONLY, DEBUGGING
10 .debug_loc    000000c3  00000000  00000000  00000bea  2**0
                  CONTENTS, READONLY, DEBUGGING
11 .debug_macinfo 00001883  00000000  00000000  00000cad  2**0
                  CONTENTS, READONLY, DEBUGGING
12 .debug_pubtypes 0000001d  00000000  00000000  00002530  2**0
                  CONTENTS, READONLY, DEBUGGING
13 .debug_ranges 00000020  00000000  00000000  0000254d  2**0
                  CONTENTS, READONLY, DEBUGGING

Disassembly of section .text:

00000000 <__vectors>:
  size_t t = s;
  do
   {
     *(y++) = *(x++);
   }
  while( --t );
   0:    0c 94 2a 00     jmp    0x54; 0x54 <__ctors_end>
   4:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
   8:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
   c:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  10:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  14:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  18:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  1c:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  20:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  24:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  28:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  2c:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  30:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  34:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  38:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  3c:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  40:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  44:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  48:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  4c:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>
  50:    0c 94 47 00     jmp    0x8e; 0x8e <__bad_interrupt>

00000054 <__ctors_end>:
  54:    11 24           eor    r1, r1
  56:    1f be           out    0x3f, r1; 63
  58:    cf e5           ldi    r28, 0x5F; 95
  5a:    d8 e0           ldi    r29, 0x08; 8
  5c:    de bf           out    0x3e, r29; 62
  5e:    cd bf           out    0x3d, r28; 61

00000060 <__do_copy_data>:
  60:    10 e0           ldi    r17, 0x00; 0
  62:    a0 e6           ldi    r26, 0x60; 96
  64:    b0 e0           ldi    r27, 0x00; 0
  66:    ec e9           ldi    r30, 0x9C; 156
  68:    f0 e0           ldi    r31, 0x00; 0
  6a:    02 c0           rjmp    .+4     ; 0x70 <__do_copy_data+0x10>
  6c:    05 90           lpm    r0, Z+
  6e:    0d 92           st    X+, r0
  70:    a0 36           cpi    r26, 0x60; 96
  72:    b1 07           cpc    r27, r17
  74:    d9 f7           brne    .-10    ; 0x6c <__do_copy_data+0xc>

00000076 <__do_clear_bss>:
  76:    10 e0           ldi    r17, 0x00; 0
  78:    a0 e6           ldi    r26, 0x60; 96
  7a:    b0 e0           ldi    r27, 0x00; 0
  7c:    01 c0           rjmp    .+2     ; 0x80 <.do_clear_bss_start>

0000007e <.do_clear_bss_loop>:
  7e:    1d 92           st    X+, r1

00000080 <.do_clear_bss_start>:
  80:    a0 36           cpi    r26, 0x60; 96
  82:    b1 07           cpc    r27, r17
  84:    e1 f7           brne    .-8     ; 0x7e <.do_clear_bss_loop>
  86:    0e 94 49 00     call    0x92; 0x92 <main>
  8a:    0c 94 4c 00     jmp    0x98; 0x98 <_exit>

0000008e <__bad_interrupt>:
  8e:    0c 94 00 00     jmp    0; 0x0 <__vectors>

00000092 <main>:
}

int main ()
{
return 1;
  92:    81 e0           ldi    r24, 0x01; 1
  94:    90 e0           ldi    r25, 0x00; 0
  96:    08 95           ret

00000098 <_exit>:
  98:    f8 94           cli

0000009a <__stop_program>:
  9a:    ff cf           rjmp    .-2     ; 0x9a <__stop_program>


вродебы так и должно работать. видимо всетаки -lprintf_flt у Вас особенная
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 9 2010, 09:19
Сообщение #8


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(klen @ Jul 7 2010, 18:39) *
что с -lprintf_flt что без - лишнего кода нет:

там ещё такой ключик -Wl,-u,vfprintf


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- demiurg_spb   -ffunction-sections и -fdata-sections   Jul 5 2010, 16:31
|- - klen   Цитата(demiurg_spb @ Jul 5 2010, 21:46) А...   Jul 5 2010, 18:33
||- - demiurg_spb   Цитата(klen @ Jul 5 2010, 22:33) ну я к п...   Jul 5 2010, 19:00
|- - demiurg_spb   Попробовал именно с Вашим исходником тестовый прое...   Jul 8 2010, 09:47
|- - klen   Цитата(ReAl @ Jul 9 2010, 13:19) там ещё ...   Jul 9 2010, 14:12
- - ReAl   Это если библиотки собраны с -ffunction-sections А...   Jul 13 2010, 04:22
- - demiurg_spb   Поэкспериментировал ещё немного и понял вот ещё чт...   Oct 15 2010, 14:49
- - aesok   Цитата(demiurg_spb @ Oct 15 2010, 18:49) ...   Oct 15 2010, 15:49
- - demiurg_spb   Спасибо! Но насколько я понял feedback стоит д...   Oct 16 2010, 09:32
- - aesok   Цитата(demiurg_spb @ Oct 16 2010, 13:32) ...   Oct 16 2010, 13:28
- - demiurg_spb   Цитата(aesok @ Oct 16 2010, 17:28) Не пон...   Oct 17 2010, 08:13


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 08:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01509 секунд с 7
ELECTRONIX ©2004-2016