2015-12-29 47 views
5

Mam bibliotekę, którą buduję. Wszystkie moje przedmioty skompilować i łącze kolejno po uruchomieniu jednej z: ar rcs lib/libryftts.a $^GCC tworzy obiekt współdzielony zamiast wykonywalnego pliku binarnego

gcc -shared $^ -o lib/libryftts.so

w moim Makefile. Mogę też z powodzeniem zainstalować je w /usr/local/lib Gdy testuję plik za pomocą nm, wszystkie funkcje są dostępne. Moim problemem jest to, że gdy uruchamiam gcc testing/test.c -lryftts -o test && file ./test lub gcc testing/test.c lib/libryftts.a -o test && file ./test mówi:

test: ELF 64-bit LSB shared object zamiast test: ELF 64-bit LSB executable jak bym się spodziewał. Co ja robię źle?

+0

Czy Twój plik 'test.c' zawiera' główny'? –

+0

@EugeneSh. Tak, zawiera główne. –

+2

Brzmi dziwnie. Ale prawdopodobnie potrzebować więcej informacji, aby zdiagnozować problem. Sugerujemy utworzenie minimalnego przypadku testowego i opublikowanie dokładnego kodu i poleceń kompilacji użytych do wytworzenia problemu. Możesz również uruchomić ostatnią linię kompilacji za pomocą 'gcc -v', aby zobaczyć dokładnie, jakie polecenia i opcje naprawdę używa gcc. – kaylum

Odpowiedz

13

Co robię źle?

Nic.

Wygląda na to, że Twój GCC jest skonfigurowany domyślnie do kompilacji plików binarnych -pie. Pliki binarne są w rzeczywistości bibliotekami współdzielonymi (typu ET_DYN), z wyjątkiem tego, że działają tak, jak normalnie wykonywalny.

Po prostu uruchom swój plik binarny i (jeśli działa) nie martw się o to.

Albo można połączyć z gcc -no-pie ... binarny i które powinny produkować niebędącą PIE wykonywalny typu ET_EXEC, dla których file powie ELF 64-bit LSB executable.

+0

Po uruchomieniu 'gcc ... -v' zobaczyłem -pie w konfiguracji. To naprawiło to, co widziałem. Dzięki za informację! –

+0

Dla każdego (jak ja), który kompiluje się z [Code :: Blocks] (http://www.codeblocks.org/) - musisz dodać '-no-pie' do ** Ustawienia Linkera → Inne opcje linkera * *, _nie_ ** Ustawienia kompilatora → Inne opcje kompilatora **, jak można się było spodziewać - ten drugi dodaje '-no-pie' podczas kompilowania poszczególnych plików C, ale nie podczas budowania końcowego pliku wykonywalnego. – GoBusto

+1

Jeśli zamierzasz używać '-no-pie', powinieneś także użyć' -fno-pie', aby uzyskać nieco bardziej efektywny kod-gen. (zobacz https://stackoverflow.com/questions/43367427/32-bit-absolute-addresses-no-longer-allowed-in-x86-64-linux) –