| Автор |
Съобщение |
|
Vesko
Ранг: Популярен
Регистриран на: Пон Мар 22, 2010 8:52 pm Мнения: 328
|
 Въпрос за GCC Link
Имам един либ (.а) в който искам да подменя една функция с моя си. Ползвам на линк-а --wrap=function_name за да я редиректна към моя. Но, ако функцията се извиква от същият ЛИБ модул тази редирекция не работи и линк-а си закача оригиналната функция. Как мога да прескоча линкването на оригиналната функция? Или как да я подменя все пак.
|
| Чет Авг 15, 2013 10:48 am |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Въпрос за GCC Link
Изтрий я от либ-а. Отвори с някой хекс едитор файла и примерно и смени името. Малко на изуст те съветвам - не знам дали няма да има някоя контролна сума и т.н. но теоретично би трябвало да се оправиш. Предполагам, че щом се налага да правиш такава магария, нямаш сорс и не можеш да прекомпилираш - иначе отговора е ясен 
_________________ Мразя да мразя ...
|
| Чет Авг 15, 2013 12:15 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Въпрос за GCC Link
Единственото читаво решение е финкциите дето ще се подменят да са декларирани като weak... Това знам че работи, ама предполага да имаш сорсовете и да ги прекомпилираш 
|
| Чет Авг 15, 2013 1:00 pm |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 9:39 pm Мнения: 2277
|
 Re: Въпрос за GCC Link
Не съм се ровил надълбоко, но няма ли инструмент с който да разкараш дадена функция от библиотека - тоя начин дето предлагаш ми изглежда доста дърводелски  . Поне под dos/win дейсвието е елементарно...
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!
|
| Чет Авг 15, 2013 1:05 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
 Re: Въпрос за GCC Link
Пробвай да извадиш (.о) файла с твоят функция извън (.а) файла...
|
| Чет Авг 15, 2013 1:30 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Въпрос за GCC Link
той проблемът е точно в о файлът (компилатион юнита). Библиотеката е просто сбор от един или повече о-файла.
|
| Чет Авг 15, 2013 1:55 pm |
|
 |
|
Vesko
Ранг: Популярен
Регистриран на: Пон Мар 22, 2010 8:52 pm Мнения: 328
|
 Re: Въпрос за GCC Link
За съжаление функцията не е в отделен .о файл. Ако беше, то --wrap щеше да работи. Но не бях се сетил да си редактирам либ-а с HEX редактор, та си напачнах функцията да ми връща 1 винаги 
|
| Чет Авг 15, 2013 1:56 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Въпрос за GCC Link
Дори и така пак няма 100% гаранция - GCC понякога е прекалено хитър, ако извикваш функцията от същия файл може да я инлайне ... малко вероятно, но все пак може да ти отвори беля.
_________________ Мразя да мразя ...
|
| Чет Авг 15, 2013 2:39 pm |
|
 |
|
Vesko
Ранг: Популярен
Регистриран на: Пон Мар 22, 2010 8:52 pm Мнения: 328
|
 Re: Въпрос за GCC Link
Не мисля, че линк-а може да я инлайне.... ама знае ли човек 
|
| Чет Авг 15, 2013 3:32 pm |
|
 |
|
1204
Ранг: Минаващ
Регистриран на: Съб Сеп 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 |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Въпрос за GCC Link
Има линк тайм оптимизации, но за тях трябва допълнително да се постарае човек. В случая говоря за компайл тиме инлайнване - според опциите за оптимизации компилатора понякога се изкушава да инлайне някои функции дори без да са маркирани като инлайн - естествено за да сработи това трябва да има достъп то сорса на съответната функция - т.е. или да е във същия сорс файл или да е инклудната в него. В същото време си компилира функцията за да я има ако някой друг я извика - т.е. това са оптимизации за скорост не за големина - почти винаги раздуват кода - ако функцията се вика с константни параметри компилатора може да прецени, че си струва да я инлайне и да оптимизира/т.е. премахне кода който няма да се изпълни в нея. Пак ти казвам - много малко вероятно, особенно за по големички функции. Лошото е, че от компилиран код без сорс или дебъг информация трудно може да прецениш какво точно е станало - трябва да дизасемблираш целия файл и да разровиш. А то стигнеш ли до там, че да ти е ясно какво точно прави написването на Ц функция е повече от лесно - т.е. възстановяваш сорса. Абе я не се занимавай ... ако работи, работи ...
_________________ Мразя да мразя ...
|
| Чет Авг 15, 2013 4:06 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
 Re: Въпрос за GCC Link
Проблем ли е да си напишеш твоя ф-я с нужното име, която да вика оригиналната?
|
| Чет Авг 15, 2013 4:21 pm |
|
 |
|
Vesko
Ранг: Популярен
Регистриран на: Пон Мар 22, 2010 8:52 pm Мнения: 328
|
 Re: Въпрос за GCC Link
Не е проблем да я напиша. Въпросът е, че линка упорито линкера дава грешка за двоино дефиниране на името. А в един и същ модул (.о) са няколко функции и не мога просто да изтрия модула от либ-а.
|
| Чет Авг 15, 2013 5:52 pm |
|
 |
|
Vesko
Ранг: Популярен
Регистриран на: Пон Мар 22, 2010 8:52 pm Мнения: 328
|
 Re: Въпрос за GCC Link
Май проблема се оказа лесен за решаване  Написах си функцията. И после с --allow-multiple-definition се махна грешката и всичко изглежда да е ок 
|
| Чет Авг 15, 2013 6:09 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Въпрос за GCC Link
В случая трябва да пренапишеш целия файл със всички функции в него, не само тази която ти пречи. Само и само за да си сигурен, че тя не се извиква директно от този файл. С тази опция --allow-multiple-definition ми намирисва, че само махаш линкерските грешки, но едва ли ти гарантира че няма да ги качи и двете функции. т.е. това е същото както и с --wrap - пак трябва да се подсигуриш, че тази функция не се вика директно в самия .о файл ако линкера го включи. Затова най сигурно е да го махнеш целия и да го замениш с нещо компилирано от теб.
_________________ Мразя да мразя ...
|
| Чет Авг 15, 2013 6:41 pm |
|
|