Микроконтролери и електроника
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

palavrov написа:
Изтрий я от либ-а. Отвори с някой хекс едитор файла и примерно и смени името...

Не съм се ровил надълбоко, но няма ли инструмент с който да разкараш дадена функция от библиотека - тоя начин дето предлагаш ми изглежда доста дърводелски :) . Поне под dos/win дейсвието е елементарно...

Автор:  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

Vesko написа:
Не мисля, че линк-а може да я инлайне.... ама знае ли човек :)

Има линк тайм оптимизации, но за тях трябва допълнително да се постарае човек. В случая говоря за компайл тиме инлайнване - според опциите за оптимизации компилатора понякога се изкушава да инлайне някои функции дори без да са маркирани като инлайн - естествено за да сработи това трябва да има достъп то сорса на съответната функция - т.е. или да е във същия сорс файл или да е инклудната в него. В същото време си компилира функцията за да я има ако някой друг я извика - т.е. това са оптимизации за скорост не за големина - почти винаги раздуват кода - ако функцията се вика с константни параметри компилатора може да прецени, че си струва да я инлайне и да оптимизира/т.е. премахне кода който няма да се изпълни в нея. Пак ти казвам - много малко вероятно, особенно за по големички функции. Лошото е, че от компилиран код без сорс или дебъг информация трудно може да прецениш какво точно е станало - трябва да дизасемблираш целия файл и да разровиш. А то стигнеш ли до там, че да ти е ясно какво точно прави написването на Ц функция е повече от лесно - т.е. възстановяваш сорса. Абе я не се занимавай ... ако работи, работи ...

Автор:  Реконструктор [ Чет Авг 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 ми намирисва, че само махаш линкерските грешки, но едва ли ти гарантира че няма да ги качи и двете функции.
Цитат:
--allow-multiple-definition
-z muldefs
Normally when a symbol is defined multiple times, the linker will report a fatal error. These options allow multiple definitions and the first definition will be used.
т.е. това е същото както и с --wrap - пак трябва да се подсигуриш, че тази функция не се вика директно в самия .о файл ако линкера го включи. Затова най сигурно е да го махнеш целия и да го замениш с нещо компилирано от теб.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/