Nie rozumiem -Wl, - rpath -Wl,

Dla wygody dodałem odpowiednie strony Man poniżej.

Moje (błędne)zrozumienie po pierwsze: jeśli muszę oddzielić opcje ,, oznacza to, że druga -Wl nie jest inną opcją, ponieważ jest przed ,, co oznacza, że jest argumentem do opcji -rpath.

Nie rozumiem jak -rpath może mieć -Wl,. argument!

Co miałoby sens w moim umyśle byłoby takie:

-Wl,-rpath .

To powinno wywołać opcję linkera-rpath z argument current directory.


Man gcc:

- WL, opcja

Pass option jako opcja do linker. Jeśli opcja zawiera przecinki, to jest podzielony na wiele opcji w przecinki. Możesz użyć tej składni, aby przekaż argument do opcji. Na przykład, -Wl,-Map,output.map przechodzi -Map output.map do linkera. Kiedy korzystając z linkera GNU, można również uzyskać ten sam efekt z `- WL, - Map=output.Mapa".

Man ld:

-rpath=dir

Dodaj katalog do ścieżka wyszukiwania biblioteki uruchomieniowej. To jest używane podczas łączenia pliku wykonywalnego ELF z obiektami współdzielonymi. All-rpath argumenty są konkatenowane i przekazywane do linkera runtime, który używa ich aby zlokalizować udostępnione obiekty w czasie wykonywania. Opcja-rpath jest również używana, gdy lokalizowanie współdzielonych obiektów, które są wymagane przez obiekty współdzielone jawnie zawarte w linku;

 261
Author: Chris Maes, 2011-07-03

4 answers

Opcja -Wl,xxxdla gcc przekazuje oddzieloną przecinkami listę tokenów jako oddzieloną spacjami listę argumentów do linkera . Więc

gcc -Wl,aaa,bbb,ccc

W końcu staje się wywołaniem linkera

ld aaa bbb ccc

W Twoim przypadku chcesz powiedzieć " ld -rpath .", więc przekazujesz to do gcc jako -Wl,-rpath,. Alternatywnie możesz określić powtarzające się przypadki -Wl:

gcc -Wl,aaa -Wl,bbb -Wl,ccc

Zauważ, że nie ma przecinka między aaa a drugim -Wl.

Lub, w Twoim przypadku, -Wl,-rpath -Wl,..

 298
Author: Kerrek SB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 12:51:28

Możesz też napisać

-Wl,-rpath=.
Aby pozbyć się tej nieznośnej przestrzeni. Jest prawdopodobnie bardziej czytelny niż dodawanie dodatkowych przecinków (to dokładnie to, co jest przekazywane do ld).
 66
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-27 19:21:19

Jeszcze jedno. Może być konieczne podanie opcji-l oraz - np

-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz

Lub możesz skończyć z błędem jak

ld: cannot find -lbaz
 39
Author: vince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-08 01:46:41

Strona podręcznika jest dość jasna. Jeśli chcesz przekazać dwa argumenty (-rpath i .) do linkera możesz napisać

-Wl,-rpath,.

Lub alternatywnie

-Wl,-rpath -Wl,.
Argumenty, które zasugerowałeś, nie mają dla mnie sensu. Skąd gcc ma wiedzieć, że twój drugi argument (.) ma być przekazany do linkera zamiast być interpretowany normalnie? Jedynym sposobem, aby mógł to wiedzieć, jest posiadanie wiedzy poufnej o wszystkich możliwych łącznikach argumenty, więc wiedział, że -rpath wymaga argumentu po nim.
 11
Author: David Grayson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-30 15:46:10