@@ -112,6 +112,7 @@ pub struct Build {
112
112
archiver : Option < PathBuf > ,
113
113
cargo_metadata : bool ,
114
114
pic : Option < bool > ,
115
+ use_plt : Option < bool > ,
115
116
static_crt : Option < bool > ,
116
117
shared_flag : Option < bool > ,
117
118
static_flag : Option < bool > ,
@@ -319,6 +320,7 @@ impl Build {
319
320
archiver : None ,
320
321
cargo_metadata : true ,
321
322
pic : None ,
323
+ use_plt : None ,
322
324
static_crt : None ,
323
325
warnings : None ,
324
326
extra_warnings : None ,
@@ -822,6 +824,21 @@ impl Build {
822
824
self
823
825
}
824
826
827
+ /// Configures whether the Procedure Linkage Table is used for indirect
828
+ /// calls into shared libraries.
829
+ ///
830
+ /// The PLT is used to provide features like lazy binding, but introduces
831
+ /// a small performance loss due to extra pointer indirection. Setting
832
+ /// `use_plt` to `false` can provide a small performance increase.
833
+ ///
834
+ /// Note that skipping the PLT requires a recent version of GCC/Clang.
835
+ ///
836
+ /// This only applies to ELF targets. It has no effect on other platforms.
837
+ pub fn use_plt ( & mut self , use_plt : bool ) -> & mut Build {
838
+ self . use_plt = Some ( use_plt) ;
839
+ self
840
+ }
841
+
825
842
/// Configures whether the /MT flag or the /MD flag will be passed to msvc build tools.
826
843
///
827
844
/// This option defaults to `false`, and affect only msvc targets.
@@ -1123,6 +1140,11 @@ impl Build {
1123
1140
}
1124
1141
if self . pic . unwrap_or ( !target. contains ( "windows-gnu" ) ) {
1125
1142
cmd. push_cc_arg ( "-fPIC" . into ( ) ) ;
1143
+ // PLT only applies if code is compiled with PIC support,
1144
+ // and only for ELF targets.
1145
+ if target. contains ( "linux" ) && !self . use_plt . unwrap_or ( true ) {
1146
+ cmd. push_cc_arg ( "-fno-plt" . into ( ) ) ;
1147
+ }
1126
1148
}
1127
1149
}
1128
1150
}
0 commit comments