2010-12-28 24 views
11

jaka jest różnica między łączeniem z gcc_s i gcc za pomocą LDFLAGS? Czy gcc_s jest biblioteką statyczną i biblioteką wspólną GCC?różnica między -lgcc_s i gcc

Ponieważ szukałem rozwiązania, w którym wspomniano o łączeniu z gcc, podczas gdy w moim przypadku działa tylko gcc_s. Chciałbym poznać prawdziwą różnicę.

< < ukryty symbol `__name_here” w /some/library/path.a(_filename.o) jest określany przez DSO

W tym przypadku problemem jest zazwyczaj rozwiązany poprzez dodanie „-l gcc "lub" gcc -print-libgcc-file-name "do flag łączenia (LDFLAGS). Jednak w przeciwieństwie do moich innych zwykłych platform (i386, amd64, sparc64) tutaj to nie wystarczyło. Po wielu headbangingu (aby być uczciwym, również pochodzi z muzyki) zdałem sobie sprawę, że ta flaga jest niezbędna zarówno podczas łączenia libc i końcowego pliku wykonywalnego. link: http://people.defora.org/~khorben/200903.html

+0

Istnieje również "libgcc_eh.a", który jest używany, gdy używane jest '-static'. http://stackoverflow.com/questions/10763394/how-to-build-ac-program-using-a-custom-version-of-glibc-and-static-linking –

Odpowiedz

12

libgcc_s.so jest biblioteką dzieloną, libgcc.a jest biblioteką statyczną. Nie są one równoważne; może być konieczne połączenie obu. libgcc_s zawiera zmienne globalne, które nie mogą mieć wielu kopii w procesie; kod w libgcc można bezpiecznie połączyć kilka razy.

+0

Cześć, dzięki, << to może być konieczne połączyć oba. Kiedy pojawi się ta konieczność? – kumar

+3

@kumar: Niektóre symbole (np. '__register_frame') są tylko w bibliotece libgcc_s, inne (np.' __eprintf') są tylko w bibliotece libgcc. Użyj 'nm -D -defined-only libgcc_s.so' resp. 'nm --defined-only libgcc.a', aby uzyskać pełne listy do porównania. –

+1

Dlaczego potrzebujemy obu? Dlaczego nie są one takie same, tylko jeden statyczny i inny dynamiczny? –