Skip to content

Commit e16de19

Browse files
committed
Enable -fno-plt by default and add tests
1 parent ee7b97e commit e16de19

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/lib.rs

+26
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ pub struct Build {
112112
archiver: Option<PathBuf>,
113113
cargo_metadata: bool,
114114
pic: Option<bool>,
115+
use_plt: Option<bool>,
115116
static_crt: Option<bool>,
116117
shared_flag: Option<bool>,
117118
static_flag: Option<bool>,
@@ -319,6 +320,7 @@ impl Build {
319320
archiver: None,
320321
cargo_metadata: true,
321322
pic: None,
323+
use_plt: None,
322324
static_crt: None,
323325
warnings: None,
324326
extra_warnings: None,
@@ -822,6 +824,25 @@ impl Build {
822824
self
823825
}
824826

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.
832+
///
833+
/// Note that skipping the PLT requires a recent version of GCC/Clang,
834+
/// therefore this option should only be considered a hint to disable the
835+
/// PLT where supported.
836+
///
837+
/// The PLT is disabled by default when PIC is enabled, with the exception
838+
/// of `powerpc64-unknown-linux-gnu`.
839+
///
840+
/// This only applies to ELF targets. It has no effect on other platforms.
841+
pub fn use_plt(&mut self, use_plt: bool) -> &mut Build {
842+
self.use_plt = Some(use_plt);
843+
self
844+
}
845+
825846
/// Configures whether the /MT flag or the /MD flag will be passed to msvc build tools.
826847
///
827848
/// This option defaults to `false`, and affect only msvc targets.
@@ -1123,6 +1144,11 @@ impl Build {
11231144
}
11241145
if self.pic.unwrap_or(!target.contains("windows-gnu")) {
11251146
cmd.push_cc_arg("-fPIC".into());
1147+
if !self.use_plt.unwrap_or(target.contains("powerpc64-unknown-linux")) {
1148+
if self.is_flag_supported("-fno-plt").unwrap_or(false) {
1149+
cmd.push_cc_arg("-fno-plt".into());
1150+
}
1151+
}
11261152
}
11271153
}
11281154
}

tests/test.rs

+13
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,19 @@ fn gnu_i686_pic() {
197197
}
198198
}
199199

200+
#[test]
201+
fn powerpc64_unknown_linux_use_plt() {
202+
let target = "powerpc64-unknown-linux-gnu";
203+
let test = Test::gnu();
204+
test.gcc()
205+
.pic(true)
206+
.target(&target)
207+
.host(&target)
208+
.file("foo.c")
209+
.compile("foo");
210+
test.cmd(0).must_not_have("-fno-plt");
211+
}
212+
200213
#[test]
201214
fn gnu_set_stdlib() {
202215
let test = Test::gnu();

0 commit comments

Comments
 (0)