Mam projekt, który tworzy wspólną bibliotekę, która jest połączona z inną, również udostępnioną, biblioteką.Zmiany wprowadzone w gcc 4.5 w odniesieniu do łączenia?
Kiedy skompilować i połączyć go z gcc 4.4, wszystko działa:
- bez ostrzeżenia podczas kompilacji lub błąd,
- ma czasu łączenie ostrzeżenie lub błąd i
ldd libmyproject.so
poprawnie raportuje zależność z druga wspólna biblioteka.
Kiedy skompilować i połączyć go z gcc 4.5, z drugiej strony (z dokładnie tymi samymi flagami), mam następujące objawy:
- bez ostrzeżenia kompilacji lub błędów,
- nie łącząc razem ostrzeżenie lub błąd ale
- biblioteka nie jest prawidłowo połączony przeciwko drugiej udostępnionego lib: sam, gdy biegnę
ldd
i nie widzę związku, a także, gdy próbuję go użyć tego manifestu: while działa z gcc 4.4, ulega awarii es przy uruchomieniu z gcc 4.5 z błędem "nie znaleziono symbolu" (oczywiście z innej biblioteki).
Spojrzałem na release notes i moja intuicja jest to, że ma coś wspólnego z nowym optymalizacji łącza czasu, ale nie mogę zrozumieć ich w wystarczającej ilości szczegółów.
Czy ktoś napotkał podobną sytuację i/lub ma jakąś radę do zaoferowania?
(Należy zauważyć, że wyniki z wynikiem 4.6 są identyczne jak w przypadku wersji 4.5).
Jakie są twoje flagi łączenia? Czy możesz odtworzyć problem za pomocą minimalnego programu (main.c, lib1.c, lib2.c, jedna funkcja w jednym wierszu)? –
Niestety dla mnie nie mogę odtworzyć tego przy minimalnym programie. Nie ma żadnych flag łączących z wyjątkiem oczekiwanych -L i -l wymaganych do znalezienia drugiej biblioteki. Powinienem również zauważyć, że nie napisałem drugiej biblioteki i nie wiem, jak ją skompilowano (ale widzę wszystkie symbole zgodnie z oczekiwaniami, używając 'nm'). – Philippe
Brzmi jak błąd gcc dla mnie ... – lvella