Rollup merge of #88820 - hlopko:add_pie_relocation_model, r=petrochenkov
Add `pie` as another `relocation-model` value MCP: https://github.com/rust-lang/compiler-team/issues/461
This commit is contained in:
commit
6f1e930581
11 changed files with 147 additions and 8 deletions
|
|
@ -435,6 +435,10 @@ Equivalent to the "uppercase" `-fPIC` or `-fPIE` options in other compilers,
|
|||
depending on the produced crate types. \
|
||||
This is the default model for majority of supported targets.
|
||||
|
||||
- `pie` - position independent executable, relocatable code but without support for symbol
|
||||
interpositioning (replacing symbols by name using `LD_PRELOAD` and similar). Equivalent to the "uppercase" `-fPIE` option in other compilers. `pie`
|
||||
code cannot be linked into shared libraries (you'll get a linking error on attempt to do this).
|
||||
|
||||
#### Special relocation models
|
||||
|
||||
- `dynamic-no-pic` - relocatable external references, non-relocatable code. \
|
||||
|
|
|
|||
35
src/test/assembly/pic-relocation-model.rs
Normal file
35
src/test/assembly/pic-relocation-model.rs
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
// revisions: x64
|
||||
// assembly-output: emit-asm
|
||||
// [x64] compile-flags: --target x86_64-unknown-linux-gnu -Crelocation-model=pic
|
||||
// [x64] needs-llvm-components: x86
|
||||
|
||||
|
||||
#![feature(no_core, lang_items)]
|
||||
#![no_core]
|
||||
#![crate_type="rlib"]
|
||||
|
||||
#[lang = "sized"]
|
||||
trait Sized {}
|
||||
#[lang = "copy"]
|
||||
trait Copy {}
|
||||
|
||||
// CHECK-LABEL: call_other_fn:
|
||||
// CHECK: {{(jmpq|callq)}} *other_fn@GOTPCREL(%rip)
|
||||
#[no_mangle]
|
||||
pub fn call_other_fn() -> u8 {
|
||||
unsafe {
|
||||
other_fn()
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: other_fn:
|
||||
// CHECK: callq *foreign_fn@GOTPCREL(%rip)
|
||||
#[no_mangle]
|
||||
#[inline(never)]
|
||||
pub fn other_fn() -> u8 {
|
||||
unsafe {
|
||||
foreign_fn()
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {fn foreign_fn() -> u8;}
|
||||
38
src/test/assembly/pie-relocation-model.rs
Normal file
38
src/test/assembly/pie-relocation-model.rs
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
// revisions: x64
|
||||
// assembly-output: emit-asm
|
||||
// [x64] compile-flags: --target x86_64-unknown-linux-gnu -Crelocation-model=pie
|
||||
// [x64] needs-llvm-components: x86
|
||||
|
||||
|
||||
#![feature(no_core, lang_items)]
|
||||
#![no_core]
|
||||
#![crate_type="rlib"]
|
||||
|
||||
#[lang = "sized"]
|
||||
trait Sized {}
|
||||
#[lang = "copy"]
|
||||
trait Copy {}
|
||||
|
||||
// CHECK-LABEL: call_other_fn:
|
||||
// With PIE local functions are called "directly".
|
||||
// CHECK: {{(jmp|callq)}} other_fn
|
||||
#[no_mangle]
|
||||
pub fn call_other_fn() -> u8 {
|
||||
unsafe {
|
||||
other_fn()
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: other_fn:
|
||||
// External functions are still called through GOT, since we don't know if the symbol
|
||||
// is defined in the binary or in the shared library.
|
||||
// CHECK: callq *foreign_fn@GOTPCREL(%rip)
|
||||
#[no_mangle]
|
||||
#[inline(never)]
|
||||
pub fn other_fn() -> u8 {
|
||||
unsafe {
|
||||
foreign_fn()
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {fn foreign_fn() -> u8;}
|
||||
16
src/test/codegen/pic-relocation-model.rs
Normal file
16
src/test/codegen/pic-relocation-model.rs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
// compile-flags: -C relocation-model=pic
|
||||
|
||||
#![crate_type = "rlib"]
|
||||
|
||||
// CHECK: define i8 @call_foreign_fn()
|
||||
#[no_mangle]
|
||||
pub fn call_foreign_fn() -> u8 {
|
||||
unsafe {
|
||||
foreign_fn()
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: declare zeroext i8 @foreign_fn()
|
||||
extern "C" {fn foreign_fn() -> u8;}
|
||||
|
||||
// CHECK: !{i32 7, !"PIC Level", i32 2}
|
||||
22
src/test/codegen/pie-relocation-model.rs
Normal file
22
src/test/codegen/pie-relocation-model.rs
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
// compile-flags: -C relocation-model=pie
|
||||
// only-x86_64-unknown-linux-gnu
|
||||
|
||||
#![crate_type = "rlib"]
|
||||
|
||||
// With PIE we know local functions cannot be interpositioned, we can mark them
|
||||
// as dso_local.
|
||||
// CHECK: define dso_local i8 @call_foreign_fn()
|
||||
#[no_mangle]
|
||||
pub fn call_foreign_fn() -> u8 {
|
||||
unsafe {
|
||||
foreign_fn()
|
||||
}
|
||||
}
|
||||
|
||||
// External functions are still marked as non-dso_local, since we don't know if the symbol
|
||||
// is defined in the binary or in the shared library.
|
||||
// CHECK: declare zeroext i8 @foreign_fn()
|
||||
extern "C" {fn foreign_fn() -> u8;}
|
||||
|
||||
// CHECK: !{i32 7, !"PIC Level", i32 2}
|
||||
// CHECK: !{i32 7, !"PIE Level", i32 2}
|
||||
Loading…
Add table
Add a link
Reference in a new issue