2016-06-05 29 views
6

Jeśli funkcja biblioteki przypomina np. malloc został ponownie zaimplementowany, następnie są dwa symbole o tej nazwie, jeden w pliku obiektu lokalnego i jeden w bibliotece systemowej. Którego z nich używa się, gdy funkcja z np. stdio jest używany, który wywołuje malloc (i dlaczego)?Jeśli zostanie ponownie zaimplementowana standardowa funkcja biblioteki, która z tych dwóch nazw jest wywoływana?

+0

Tradycyjny model polega na tym, że moduły i biblioteki później w kolejności łączenia zastępują wcześniejsze, zastępując 'malloc' nawet dla wewnętrznych odniesień. Oczywiście mogą występować komplikacje, takie jak oblanie makr, dodawanie informacji o śledzeniu lub stosowanie wewnętrznych wariantów dostarczających dodatkowych wskazówek do alokatora. – doynax

+0

Jeśli zrozumiem to prawo, oznaczałoby to, że zwykle używany jest symbol biblioteki systemowej. Ale testy pokazują, że zamiast tego używana jest funkcja lokalna (reimplementation). – user3224237

+0

Jest odwrotnie. Pliki obiektowe są połączone w ostatnio poprzedzone bibliotekami w porządku listy. – doynax

Odpowiedz

3

Zachowanie link jest w sposób ogólny:

  • Uwzględnij wszystkie symbole zdefiniowane w plikach obiektowych.
  • Następnie usuń niezdefiniowane obiekty za pomocą obiektów w bibliotekach.

Tak więc, jeśli malloc zostanie ponownie zaimplementowany i połączony jako plik obiektowy, wersja w pliku obiektowym zastąpi wersję w standardowych bibliotekach. Jeśli jednak nowe malloc jest połączone jako biblioteka, zależy to od kolejności łączenia bibliotek.

inny sposób, biorąc pod uwagę GNU BINUTILS jak zakres, aby zastąpić funkcji bibliotecznych jest zawinąć funkcję używając --wrap parametr: https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html

za pomocą opcji --wrap ld możemy dostać obie funkcje i powiązany funkcja owijki mogłaby wywołać zawiniętą.

Kolejność łączenia zależy również od kolejności parametrów wiersza poleceń. Rozważam tutaj, że biblioteki są wymienione po obiektach, ponieważ generalnie nie ma sensu umieszczać bibliotek przed obiektami, ponieważ ich celem jest dostarczenie brakujących symboli wymaganych przez te biblioteki.

-1

Jedną z odpowiedzi jest to, że wpadasz w okropne kłopoty, próbując zastąpić malloc. Nie idź tam. Nawet o tym nie myśl. Zwłaszcza jeśli chcesz zadawać pytania na temat stackoverflow, nawet o tym nie myśl.

Inną odpowiedzią jest to, że wywołujesz niezdefiniowane zachowanie, a prawdopodobnym rezultatem jest wywołanie funkcji malloc, która najbardziej Cię skrzywdzi. Jeśli masz szczęście, podczas rozwoju. Jeśli masz mniej szczęścia, gdy Twój kod znajdzie się w rękach klientów. Nie rób tego.

Pisanie otoków wokół malloc z nowymi nazwami jest wystarczająco złe. Próba zastąpienia malloc jest szaleństwem.

+0

Niestety, nie ma prawdziwego wyboru. Narzędzie do przeniesienia używa 'sbrk' * i * standardowych funkcji bibliotecznych. To nie działa na dzisiejszych systemach. Tak więc albo sbrk jest zastępowany (oznacza przepisanie znacznej części kodu narzędzi), albo dostarczany jest lokalny malloc, który nie używa 'sbrk'. Problem pozostaje: lokalny malloc nie działa z ASAN, nawet jeśli ten lokalny malloc wydaje się być poprawny. Obecnie nie jest jasne, dlaczego nie działa z ASAN. – user3224237

Powiązane problemy