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

 
 
> Как заставить GCC не линковать лишние функции, Пихает в бинарник всё подряд без разбора...
MrYuran
сообщение Nov 25 2008, 06:01
Сообщение #1


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Давно уже заметил, но сегодня глянул листинг и ужаснулся. Половина бинарника - неиспользуемые функции от фримодбаса.
Что-то надо с этим делать.
Попутно ещё вопрос: что это за хрень получается из memcpy()?
Я думал, он умнее меня сможет блоки перекидать, а он вон чего творит...
Или я чего-то не понял...
Код
00004f5c <memcpy>:
    4f5c:    0b 12           push    r11;
    4f5e:    0a 12           push    r10;
    4f60:    0a 4f           mov    r15,    r10;
    4f62:    0b 4d           mov    r13,    r11;
    4f64:    0d 4f           mov    r15,    r13;
    4f66:    0c 4e           mov    r14,    r12;
    4f68:    0b 93           cmp    #0,    r11;r3 As==00
    4f6a:    5e 24           jz    $+190;abs 0x5028
    4f6c:    0f 9e           cmp    r14,    r15;
    4f6e:    5c 24           jz    $+186;abs 0x5028
    4f70:    0f 9e           cmp    r14,    r15;
    4f72:    2b 2c           jc    $+88    ;abs 0x4fca
    4f74:    0f 4e           mov    r14,    r15;
    4f76:    0f da           bis    r10,    r15;
    4f78:    1f f3           and    #1,    r15;r3 As==01
    4f7a:    0e 24           jz    $+30    ;abs 0x4f98
    4f7c:    0f 4e           mov    r14,    r15;
    4f7e:    0f ea           xor    r10,    r15;
    4f80:    1f f3           and    #1,    r15;r3 As==01
    4f82:    02 20           jnz    $+6     ;abs 0x4f88
    4f84:    2b 93           cmp    #2,    r11;r3 As==10
    4f86:    1c 2c           jc    $+58    ;abs 0x4fc0
    4f88:    0e 4b           mov    r11,    r14;
    4f8a:    0b 8e           sub    r14,    r11;
    4f8c:    ed 4c 00 00     mov.b    @r12,    0(r13);
    4f90:    1c 53           inc    r12;
    4f92:    1d 53           inc    r13;
    4f94:    3e 53           add    #-1,    r14;r3 As==11
    4f96:    fa 23           jnz    $-10    ;abs 0x4f8c
    4f98:    0e 4b           mov    r11,    r14;
    4f9a:    12 c3           clrc            
    4f9c:    0e 10           rrc    r14;
    4f9e:    0e 93           cmp    #0,    r14;r3 As==00
    4fa0:    05 24           jz    $+12    ;abs 0x4fac
    4fa2:    bd 4c 00 00     mov    @r12+,    0(r13);
    4fa6:    2d 53           incd    r13;
    4fa8:    3e 53           add    #-1,    r14;r3 As==11
    4faa:    fb 23           jnz    $-8     ;abs 0x4fa2
    4fac:    0e 4b           mov    r11,    r14;
    4fae:    1e f3           and    #1,    r14;r3 As==01
    4fb0:    3b 24           jz    $+120;abs 0x5028
    4fb2:    ed 4c 00 00     mov.b    @r12,    0(r13);
    4fb6:    1c 53           inc    r12;
    4fb8:    1d 53           inc    r13;
    4fba:    3e 53           add    #-1,    r14;r3 As==11
    4fbc:    fa 23           jnz    $-10    ;abs 0x4fb2
    4fbe:    34 3c           jmp    $+106;abs 0x5028
    4fc0:    0f 4e           mov    r14,    r15;
    4fc2:    1f f3           and    #1,    r15;r3 As==01
    4fc4:    2e 43           mov    #2,    r14;r3 As==10
    4fc6:    0e 8f           sub    r15,    r14;
    4fc8:    e0 3f           jmp    $-62    ;abs 0x4f8a
    4fca:    0c 4e           mov    r14,    r12;
    4fcc:    0c 5b           add    r11,    r12;
    4fce:    0d 4f           mov    r15,    r13;
    4fd0:    0d 5b           add    r11,    r13;
    4fd2:    0f 4c           mov    r12,    r15;
    4fd4:    0f dd           bis    r13,    r15;
    4fd6:    1f f3           and    #1,    r15;r3 As==01
    4fd8:    0f 24           jz    $+32    ;abs 0x4ff8
    4fda:    0f 4c           mov    r12,    r15;
    4fdc:    0f ed           xor    r13,    r15;
    4fde:    1f f3           and    #1,    r15;r3 As==01
    4fe0:    03 20           jnz    $+8     ;abs 0x4fe8
    4fe2:    3b 90 03 00     cmp    #3,    r11;#0x0003
    4fe6:    1d 2c           jc    $+60    ;abs 0x5022
    4fe8:    0e 4b           mov    r11,    r14;
    4fea:    0b 8e           sub    r14,    r11;
    4fec:    3d 53           add    #-1,    r13;r3 As==11
    4fee:    3c 53           add    #-1,    r12;r3 As==11
    4ff0:    ed 4c 00 00     mov.b    @r12,    0(r13);
    4ff4:    3e 53           add    #-1,    r14;r3 As==11
    4ff6:    fa 23           jnz    $-10    ;abs 0x4fec
    4ff8:    0e 4b           mov    r11,    r14;
    4ffa:    12 c3           clrc            
    4ffc:    0e 10           rrc    r14;
    4ffe:    0e 93           cmp    #0,    r14;r3 As==00
    5000:    06 24           jz    $+14    ;abs 0x500e
    5002:    2c 83           decd    r12;
    5004:    2d 83           decd    r13;
    5006:    ad 4c 00 00     mov    @r12,    0(r13);
    500a:    3e 53           add    #-1,    r14;r3 As==11
    500c:    fa 23           jnz    $-10    ;abs 0x5002
    500e:    0e 4b           mov    r11,    r14;
    5010:    1e f3           and    #1,    r14;r3 As==01
    5012:    0a 24           jz    $+22    ;abs 0x5028
    5014:    3d 53           add    #-1,    r13;r3 As==11
    5016:    3c 53           add    #-1,    r12;r3 As==11
    5018:    ed 4c 00 00     mov.b    @r12,    0(r13);
    501c:    3e 53           add    #-1,    r14;r3 As==11
    501e:    fa 23           jnz    $-10    ;abs 0x5014
    5020:    03 3c           jmp    $+8     ;abs 0x5028
    5022:    0e 4c           mov    r12,    r14;
    5024:    1e f3           and    #1,    r14;r3 As==01
    5026:    e1 3f           jmp    $-60    ;abs 0x4fea
    5028:    0f 4a           mov    r10,    r15;
    502a:    3a 41           pop    r10;
    502c:    3b 41           pop    r11;
    502e:    30 41           ret

PS; иногда бывает полезно поглядеть, чего заливаешь в железку...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Nov 25 2008, 08:15
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Нашёл лишний ключ.
--gc-sections убивает секцию .text наповал...

В общем, поколупался, нашёл.
как говорится, "сам дурак".
Надо было обозначить #define MB_ASCII_ENABLED ( 0 )
чтобы соответствующие функции выкидывались, иначе откуда компилятору знать

С ключами полная засада, непонятно чего они там творят, в общем решил не лечить, что работает.
Выяснил подлый ключик -s, который выкидывает из эльфа все текстовые метки, и в результате листинг нечитабельный


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 25 2008, 15:32
Сообщение #3


Гуру
******

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



Цитата(MrYuran @ Nov 25 2008, 10:15) *
Нашёл лишний ключ.
--gc-sections убивает секцию .text наповал...
--gc-sections имеет смысл только в комплекте с --ffunction-section.
По поводу выкидывания всего - смотрите внимательно скрипт линкера. В качестве образца возьмите скрипт из последней или предпоследней версии WinAVR. Обратите внимание, что секции .initX и .vectors должны быть описаны с KEEP() в скрипте. Именно из этих секций вызывается main и обработчики прерываний, именно эти секции не должны быть выкинуты и "тянут за собой" все используемые функции.


--------------------
На любой вопрос даю любой ответ
"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
msalov
сообщение Nov 25 2008, 15:40
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Сергей Борщ @ Nov 25 2008, 17:32) *
--gc-sections имеет смысл только в комплекте с --ffunction-section.
Почему только? Разве для каждой единицы компиляции не создается своя секция? -ffunction-section и -fdata-section таким образом повышают эффективность сборщика мусора, но
не включают его. Хотя на практике имеем, что хоть одна функция из единицы компиляции всё таки да и спользуется, сводя на нет усилия сборщика мусора, без раделения функций на секции.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 25 2008, 16:42
Сообщение #5


Гуру
******

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



Цитата(gotty @ Nov 25 2008, 17:40) *
Почему только? Разве для каждой единицы компиляции не создается своя секция?
А вы загляните в листинг. Все складывается в ".text". С --ffunction-section каждая функция кладется в секцию ".text.func_name". Без --function-section -gc-sections мог бы выкинуть только всю секцию .text и другие неиспользуемые секции (.initX, .finiX, .ctors и т.д.) но KEEP() в скрипте линкера не позволяет этого.
Цитата(gotty @ Nov 25 2008, 17:40) *
-ffunction-section и -fdata-section таким образом повышают эффективность сборщика мусора, но не включают его.
Естественно. ведь -gc-sections расшифровывается как garbage collection on sections. Логично предположить, что именно этот ключ и включает сборщик мусора.
Цитата(gotty @ Nov 25 2008, 17:40) *
Хотя на практике имеем, что хоть одна функция из единицы компиляции всё таки да и спользуется, сводя на нет усилия сборщика мусора, без раделения функций на секции.
Нет, тут вы не правы. Можете провести эксперимент (или почитать документацию на ld).


--------------------
На любой вопрос даю любой ответ
"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
klen
сообщение Nov 25 2008, 19:12
Сообщение #6


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

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



сдедал ЭТО. всунул -ffunction-sections и -Wl,-gc-sections. Про KEEP я не знал, засунул в него секцию векторов - далее все тянется друг за дружку. Спасибо за урок.
получил минус 10% кода, все также хорошо работает.

век живи, век учись - как был дурак, так и останешся smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MrYuran   Как заставить GCC не линковать лишние функции   Nov 25 2008, 06:01
- - scifi   Цитата(MrYuran @ Nov 25 2008, 09:01) Давн...   Nov 25 2008, 06:35
|- - MrYuran   Цитата(scifi @ Nov 25 2008, 09:35) http:/...   Nov 25 2008, 07:03
|- - zltigo   Цитата(MrYuran @ Nov 25 2008, 10:03) Попр...   Nov 25 2008, 07:17
- - ARV   http://electronix.ru/forum/index.php?showt...amp;s...   Nov 25 2008, 07:36
|- - sla000   Цитата(MrYuran @ Nov 25 2008, 15:15) Нашё...   Nov 25 2008, 11:36
||- - alx2   Цитата(sla000 @ Nov 25 2008, 16:36) Цитат...   Nov 25 2008, 22:38
|||- - Terminator   ... Цитата(alx2 @ Nov 26 2008, 04:38) Поэ...   Nov 26 2008, 03:26
|||- - alx2   Цитата(Terminator @ Nov 26 2008, 08:26) А...   Nov 26 2008, 18:15
|||- - Terminator   Цитата(alx2 @ Nov 27 2008, 00:15) Наприме...   Nov 27 2008, 06:02
||- - ReAl   Цитата(sla000 @ Nov 25 2008, 13:36) Стран...   Dec 11 2008, 08:36
- - MrYuran   Написал свой memcpy: Код while(NumOfWords--...   Nov 25 2008, 12:56
- - gotty   Цитата(MrYuran @ Nov 25 2008, 14:56) Непо...   Nov 25 2008, 15:20


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

 


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


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