| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Въпрос за GCC Link http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=11643 |
Страница 1 от 2 |
| Автор: | Vesko [ Чет Авг 15, 2013 10:48 am ] |
| Заглавие: | Въпрос за GCC Link |
Имам един либ (.а) в който искам да подменя една функция с моя си. Ползвам на линк-а --wrap=function_name за да я редиректна към моя. Но, ако функцията се извиква от същият ЛИБ модул тази редирекция не работи и линк-а си закача оригиналната функция. Как мога да прескоча линкването на оригиналната функция? Или как да я подменя все пак. |
|
| Автор: | palavrov [ Чет Авг 15, 2013 12:15 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
Изтрий я от либ-а. Отвори с някой хекс едитор файла и примерно и смени името. Малко на изуст те съветвам - не знам дали няма да има някоя контролна сума и т.н. но теоретично би трябвало да се оправиш. Предполагам, че щом се налага да правиш такава магария, нямаш сорс и не можеш да прекомпилираш - иначе отговора е ясен |
|
| Автор: | miro_atc [ Чет Авг 15, 2013 1:00 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
Единственото читаво решение е финкциите дето ще се подменят да са декларирани като weak... Това знам че работи, ама предполага да имаш сорсовете и да ги прекомпилираш |
|
| Автор: | syscop [ Чет Авг 15, 2013 1:05 pm ] | |||||||||
| Заглавие: | Re: Въпрос за GCC Link | |||||||||
Не съм се ровил надълбоко, но няма ли инструмент с който да разкараш дадена функция от библиотека - тоя начин дето предлагаш ми изглежда доста дърводелски |
||||||||||
| Автор: | relsys [ Чет Авг 15, 2013 1:30 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
Пробвай да извадиш (.о) файла с твоят функция извън (.а) файла... |
|
| Автор: | miro_atc [ Чет Авг 15, 2013 1:55 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
той проблемът е точно в о файлът (компилатион юнита). Библиотеката е просто сбор от един или повече о-файла. |
|
| Автор: | Vesko [ Чет Авг 15, 2013 1:56 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
За съжаление функцията не е в отделен .о файл. Ако беше, то --wrap щеше да работи. Но не бях се сетил да си редактирам либ-а с HEX редактор, та си напачнах функцията да ми връща 1 винаги |
|
| Автор: | palavrov [ Чет Авг 15, 2013 2:39 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
Дори и така пак няма 100% гаранция - GCC понякога е прекалено хитър, ако извикваш функцията от същия файл може да я инлайне ... малко вероятно, но все пак може да ти отвори беля. |
|
| Автор: | Vesko [ Чет Авг 15, 2013 3:32 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
Не мисля, че линк-а може да я инлайне.... ама знае ли човек |
|
| Автор: | 1204 [ Чет Авг 15, 2013 3:45 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
Виж binutils https://www.gnu.org/software/binutils/ ar -x lib.a ar -r ... ar -q *.o |
|
| Автор: | palavrov [ Чет Авг 15, 2013 4:06 pm ] | |||||||||
| Заглавие: | Re: Въпрос за GCC Link | |||||||||
Има линк тайм оптимизации, но за тях трябва допълнително да се постарае човек. В случая говоря за компайл тиме инлайнване - според опциите за оптимизации компилатора понякога се изкушава да инлайне някои функции дори без да са маркирани като инлайн - естествено за да сработи това трябва да има достъп то сорса на съответната функция - т.е. или да е във същия сорс файл или да е инклудната в него. В същото време си компилира функцията за да я има ако някой друг я извика - т.е. това са оптимизации за скорост не за големина - почти винаги раздуват кода - ако функцията се вика с константни параметри компилатора може да прецени, че си струва да я инлайне и да оптимизира/т.е. премахне кода който няма да се изпълни в нея. Пак ти казвам - много малко вероятно, особенно за по големички функции. Лошото е, че от компилиран код без сорс или дебъг информация трудно може да прецениш какво точно е станало - трябва да дизасемблираш целия файл и да разровиш. А то стигнеш ли до там, че да ти е ясно какво точно прави написването на Ц функция е повече от лесно - т.е. възстановяваш сорса. Абе я не се занимавай ... ако работи, работи ... |
||||||||||
| Автор: | Реконструктор [ Чет Авг 15, 2013 4:21 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
Проблем ли е да си напишеш твоя ф-я с нужното име, която да вика оригиналната? |
|
| Автор: | Vesko [ Чет Авг 15, 2013 5:52 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
Не е проблем да я напиша. Въпросът е, че линка упорито линкера дава грешка за двоино дефиниране на името. А в един и същ модул (.о) са няколко функции и не мога просто да изтрия модула от либ-а. |
|
| Автор: | Vesko [ Чет Авг 15, 2013 6:09 pm ] |
| Заглавие: | Re: Въпрос за GCC Link |
Май проблема се оказа лесен за решаване Написах си функцията. И после с --allow-multiple-definition се махна грешката и всичко изглежда да е ок |
|
| Автор: | palavrov [ Чет Авг 15, 2013 6:41 pm ] | |||||||||
| Заглавие: | Re: Въпрос за GCC Link | |||||||||
В случая трябва да пренапишеш целия файл със всички функции в него, не само тази която ти пречи. Само и само за да си сигурен, че тя не се извиква директно от този файл. С тази опция --allow-multiple-definition ми намирисва, че само махаш линкерските грешки, но едва ли ти гарантира че няма да ги качи и двете функции.
|
||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|