@@ -65,6 +65,7 @@ pub struct GnuLinker<'a> {
65
65
pub name : & ' a str ,
66
66
pub cmd : Command ,
67
67
pub sess : & ' a Session ,
68
+ pub is_lld : bool ,
68
69
}
69
70
70
71
impl < ' a > GnuLinker < ' a > {
@@ -86,16 +87,45 @@ impl<'a> fmt::Display for GnuLinker<'a> {
86
87
}
87
88
88
89
impl < ' a > Linker for GnuLinker < ' a > {
89
- fn link_dylib ( & mut self , lib : & str ) { self . arg ( "-l" ) . arg ( lib) ; }
90
- fn link_staticlib ( & mut self , lib : & str ) { self . arg ( "-l" ) . arg ( lib) ; }
90
+ fn link_dylib ( & mut self , lib : & str ) {
91
+ if self . is_lld && self . sess . target . target . options . is_like_osx {
92
+ let mut v = OsString :: from ( "-l" ) ;
93
+ v. push ( lib) ;
94
+ self . arg ( & v) ;
95
+ } else {
96
+ self . arg ( "-l" ) . arg ( lib) ;
97
+ }
98
+ }
99
+ fn link_staticlib ( & mut self , lib : & str ) {
100
+ if self . is_lld && self . sess . target . target . options . is_like_osx {
101
+ let mut v = OsString :: from ( "-l" ) ;
102
+ v. push ( lib) ;
103
+ self . arg ( & v) ;
104
+ } else {
105
+ self . arg ( "-l" ) . arg ( lib) ;
106
+ }
107
+ }
91
108
fn link_rlib ( & mut self , lib : & Path ) { self . arg ( lib) ; }
92
109
fn include_path ( & mut self , path : & Path ) { self . arg ( "-L" ) . arg ( path) ; }
93
110
fn framework_path ( & mut self , path : & Path ) { self . arg ( "-F" ) . arg ( path) ; }
94
111
fn output_filename ( & mut self , path : & Path ) { self . arg ( "-o" ) . arg ( path) ; }
95
112
fn add_object ( & mut self , path : & Path ) { self . arg ( path) ; }
96
113
fn position_independent_executable ( & mut self ) { self . arg ( "-pie" ) ; }
97
114
fn arg < S : AsRef < OsStr > > ( & mut self , arg : S ) -> & mut Self {
98
- self . cmd . arg ( arg) ;
115
+ if self . is_lld {
116
+ match arg. as_ref ( ) . to_str ( ) {
117
+ Some ( args_str) => {
118
+ for arg_str in args_str. trim_left_matches ( "-Wl," ) . split ( ',' ) {
119
+ self . cmd . arg ( arg_str) ;
120
+ }
121
+ } ,
122
+ None => {
123
+ self . cmd . arg ( arg. as_ref ( ) ) ;
124
+ } ,
125
+ }
126
+ } else {
127
+ self . cmd . arg ( arg) ;
128
+ }
99
129
self
100
130
}
101
131
fn args < S : AsRef < OsStr > > ( & mut self , args : & [ S ] ) -> & mut Self {
@@ -109,7 +139,13 @@ impl<'a> Linker for GnuLinker<'a> {
109
139
}
110
140
111
141
fn link_rust_dylib ( & mut self , lib : & str , _path : & Path ) {
112
- self . arg ( "-l" ) . arg ( lib) ;
142
+ if self . is_lld && self . sess . target . target . options . is_like_osx {
143
+ let mut v = OsString :: from ( "-l" ) ;
144
+ v. push ( lib) ;
145
+ self . arg ( & v) ;
146
+ } else {
147
+ self . arg ( "-l" ) . arg ( lib) ;
148
+ }
113
149
}
114
150
115
151
fn link_framework ( & mut self , framework : & str ) {
@@ -124,9 +160,9 @@ impl<'a> Linker for GnuLinker<'a> {
124
160
v. push ( & archive:: find_library ( lib, search_path, & self . sess ) ) ;
125
161
self . arg ( & v) ;
126
162
} else {
127
- self . arg ( "-Wl,--whole-archive" )
128
- . arg ( "-l" ) . arg ( lib)
129
- . arg ( "-Wl,--no-whole-archive" ) ;
163
+ self . arg ( "-Wl,--whole-archive" ) ;
164
+ self . link_staticlib ( lib) ;
165
+ self . arg ( "-Wl,--no-whole-archive" ) ;
130
166
}
131
167
}
132
168
0 commit comments