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

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
 |
Ответов
|
Nov 25 2008, 08:15
|

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

|
Нашёл лишний ключ. --gc-sections убивает секцию .text наповал...
В общем, поколупался, нашёл. как говорится, "сам дурак". Надо было обозначить #define MB_ASCII_ENABLED ( 0 ) чтобы соответствующие функции выкидывались, иначе откуда компилятору знать
С ключами полная засада, непонятно чего они там творят, в общем решил не лечить, что работает. Выяснил подлый ключик -s, который выкидывает из эльфа все текстовые метки, и в результате листинг нечитабельный
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Nov 25 2008, 11:36
|

Участник

Группа: Участник
Сообщений: 20
Регистрация: 25-06-07
Из: Томск
Пользователь №: 28 670

|
Цитата(MrYuran @ Nov 25 2008, 15:15)  Нашёл лишний ключ. --gc-sections убивает секцию .text наповал... Странно, уж хотя бы main то должен остаться. У меня это ключ отлично работает в avr-gcc и arm-gcc.
|
|
|
|
|
Nov 25 2008, 22:38
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(sla000 @ Nov 25 2008, 16:36)  Цитата(MrYuran @ Nov 25 2008, 13:15)  Нашёл лишний ключ. --gc-sections
Странно, уж хотя бы main то должен остаться. У меня это ключ отлично работает в avr-gcc и arm-gcc. Еще добавлю пару замечаний. Во-первых, линкует линкер, а не компилятор. В смысле, что линкер входит в состав binutils, а вовсе не gcc. Но это так, в плане занудства.  Во-вторых, понять, почему линкер прилинковал к программе тот или иной модуль, хорошо помогает генерация map-файла. Там для каждого загруженного линкером модуля оказываются символы, ради которых этот модуль был загружен, и модуль, который на этот символ имеет ссылку. Поэтому настоятельно рекомендую просить линкер генерить map-файл и иногда туда внимательно смотреть. А то бывает, что из-за какого-нибудь никому не нужного __do_copy_data, к проекту как снежный ком прилинкуется с десяток библиотечных модулей...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Nov 26 2008, 18:15
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(Terminator @ Nov 26 2008, 08:26)  А как по map файлу понять кому нужна та или иная функция? Например такая запись в map файле Код /usr/home/alx/work/psm-18/lib/libnet.a(tcp.o) kmpo.o (_Z6sockettt) означает, что модуль tcp.o загружен из библиотеки /usr/home/alx/work/psm-18/lib/libnet.a из-за того что модулю kmpo.o нужен символ _Z6sockettt.
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Nov 27 2008, 06:02
|

Местный
  
Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382

|
Цитата(alx2 @ Nov 27 2008, 00:15)  Например такая запись в map файле Код /usr/home/alx/work/psm-18/lib/libnet.a(tcp.o) kmpo.o (_Z6sockettt) означает, что модуль tcp.o загружен из библиотеки /usr/home/alx/work/psm-18/lib/libnet.a из-за того что модулю kmpo.o нужен символ _Z6sockettt. А слона то я и не приметил Большое спасибо за разъяснения.
|
|
|
|
Сообщений в этой теме
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  ReAl Цитата(sla000 @ Nov 25 2008, 13:36) Стран... Dec 11 2008, 08:36 Сергей Борщ Цитата(MrYuran @ Nov 25 2008, 10:15) Нашё... Nov 25 2008, 15:32  gotty Цитата(Сергей Борщ @ Nov 25 2008, 17:32) ... Nov 25 2008, 15:40   Сергей Борщ Цитата(gotty @ Nov 25 2008, 17:40) Почему... Nov 25 2008, 16:42    klen сдедал ЭТО. всунул -ffunction-sections и -Wl,-gc-s... Nov 25 2008, 19:12 MrYuran Написал свой memcpy:
Код
while(NumOfWords--... Nov 25 2008, 12:56 gotty Цитата(MrYuran @ Nov 25 2008, 14:56) Непо... Nov 25 2008, 15:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|