Отговори на тема  [ 16 мнения ]  Отиди на страница 1, 2  Следваща
Въпрос за GCC Link 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Мар 22, 2010 8:52 pm
Мнения: 328
Мнение Въпрос за GCC Link
Имам един либ (.а) в който искам да подменя една функция с моя си. Ползвам на линк-а --wrap=function_name за да я редиректна към моя. Но, ако функцията се извиква от същият ЛИБ модул тази редирекция не работи и линк-а си закача оригиналната функция. Как мога да прескоча линкването на оригиналната функция? Или как да я подменя все пак.


Чет Авг 15, 2013 10:48 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Въпрос за GCC Link
Изтрий я от либ-а. Отвори с някой хекс едитор файла и примерно и смени името. Малко на изуст те съветвам - не знам дали няма да има някоя контролна сума и т.н. но теоретично би трябвало да се оправиш. Предполагам, че щом се налага да правиш такава магария, нямаш сорс и не можеш да прекомпилираш - иначе отговора е ясен :)

_________________
Мразя да мразя ...


Чет Авг 15, 2013 12:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Въпрос за GCC Link
Единственото читаво решение е финкциите дето ще се подменят да са декларирани като weak... Това знам че работи, ама предполага да имаш сорсовете и да ги прекомпилираш ;-)


Чет Авг 15, 2013 1:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: Въпрос за GCC Link
palavrov написа:
Изтрий я от либ-а. Отвори с някой хекс едитор файла и примерно и смени името...

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

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Чет Авг 15, 2013 1:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Въпрос за GCC Link
Пробвай да извадиш (.о) файла с твоят функция извън (.а) файла...


Чет Авг 15, 2013 1:30 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Въпрос за GCC Link
той проблемът е точно в о файлът (компилатион юнита). Библиотеката е просто сбор от един или повече о-файла.


Чет Авг 15, 2013 1:55 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Мар 22, 2010 8:52 pm
Мнения: 328
Мнение Re: Въпрос за GCC Link
За съжаление функцията не е в отделен .о файл. Ако беше, то --wrap щеше да работи.

Но не бях се сетил да си редактирам либ-а с HEX редактор, та си напачнах функцията да ми връща 1 винаги :)


Чет Авг 15, 2013 1:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Въпрос за GCC Link
Дори и така пак няма 100% гаранция - GCC понякога е прекалено хитър, ако извикваш функцията от същия файл може да я инлайне ... малко вероятно, но все пак може да ти отвори беля.

_________________
Мразя да мразя ...


Чет Авг 15, 2013 2:39 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Мар 22, 2010 8:52 pm
Мнения: 328
Мнение Re: Въпрос за GCC Link
Не мисля, че линк-а може да я инлайне.... ама знае ли човек :)


Чет Авг 15, 2013 3:32 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Сеп 22, 2012 3:04 pm
Мнения: 14
Мнение Re: Въпрос за GCC Link
Виж binutils
https://www.gnu.org/software/binutils/
ar -x lib.a
ar -r ...
ar -q *.o


Чет Авг 15, 2013 3:45 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Въпрос за GCC Link
Vesko написа:
Не мисля, че линк-а може да я инлайне.... ама знае ли човек :)

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

_________________
Мразя да мразя ...


Чет Авг 15, 2013 4:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Re: Въпрос за GCC Link
Проблем ли е да си напишеш твоя ф-я с нужното име, която да вика оригиналната?


Чет Авг 15, 2013 4:21 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Мар 22, 2010 8:52 pm
Мнения: 328
Мнение Re: Въпрос за GCC Link
Не е проблем да я напиша. Въпросът е, че линка упорито линкера дава грешка за двоино дефиниране на името. А в един и същ модул (.о) са няколко функции и не мога просто да изтрия модула от либ-а.


Чет Авг 15, 2013 5:52 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Мар 22, 2010 8:52 pm
Мнения: 328
Мнение Re: Въпрос за GCC Link
Май проблема се оказа лесен за решаване :)

Написах си функцията. И после с --allow-multiple-definition се махна грешката и всичко изглежда да е ок :)


Чет Авг 15, 2013 6:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение 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 - пак трябва да се подсигуриш, че тази функция не се вика директно в самия .о файл ако линкера го включи. Затова най сигурно е да го махнеш целия и да го замениш с нещо компилирано от теб.

_________________
Мразя да мразя ...


Чет Авг 15, 2013 6:41 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 16 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни