Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • B buck
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 201
    • Issues 201
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 22
    • Merge requests 22
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Meta
  • buck
  • Issues
  • #2435
Closed
Open
Issue created Apr 03, 2020 by Administrator@rootContributor

PIE/non-PIE mixups when integrating Rust and C

Created by: v-jizhang

Repro project: $cat BUCK

linker_flags = []

# MacOS build fix
linker_flags += [
    "-lresolv",
]

# On Linux, Rust's standard library is built by default with threading support
# and with stacktrace symbolication support. Link libraries required for these
# features.
linker_flags += [
    "-ldl",
    "-lpthread",
]

cxx_binary(
    name = "hello",
    #link_style = "shared",
    srcs = ["main.c"],
    link_style = "static",
    linker_flags = linker_flags,
    deps = [":helloer"],
)

cxx_binary(
    name = "hello-shared",
    srcs = ["main.c"],
    link_style = "shared",
    linker_flags = linker_flags,
    deps = [":helloer"],
)

rust_library(
    name = "helloer",
    srcs = ["helloer.rs"],
    deps = [":morehello"],
)

rust_library(
    name = "morehello",
    srcs = ["morehello.rs"],
    deps = [":morehellodep"],
)

cxx_library(
    name = "morehellodep",
    srcs = ["morehellodep.c"],
)

$cat helloer.rs

extern crate morehello;

#[no_mangle]
pub extern "C" fn helloer() {
    println!("I'm printing hello!");
    morehello::helloer();
}

$cat main.c

#include <stdio.h>

extern void helloer(void);

int main() {
    printf("Calling helloer\n");
    helloer();
    printf("Helloer called\n");
    return 0;
}

$cat morehello.rs

extern "C" {
    fn evenmorehello();
}

pub fn helloer() {
    println!("I'm saying \"hello\" again!");
    unsafe { evenmorehello() };
}

$cat morehellodep.c

#include <stdio.h>

extern void evenmorehello(void) {
    printf("Hello back from C-land\n");
}

On Linux(Ubuntu 18.04.4 LTS), the shared target //:hello-shared builds but the static target //:hello won’t. The error reads “stderr: /usr/bin/ld: buck-out/gen/helloer#default,static/libhelloer-795ec4d5b6ad4640.a(helloer-795ec4d5b6ad4640.helloer.eqqwwzev-cgu.0.rcgu.o): relocation R_X86_64_32S against `.rodata..L__unnamed_1' can not be used when making a PIE object; recompile with -fPIC” From Jeremy Fitzhardinge: "I think the problem is that Buck thinks it's making a plain static non-PIE executable so it has build non-PIC libraries, whereas rustc thinks its generating PIE and so needs PIC libraries. The mismatch is likely a bug on Buck's side, and I seem to remember there were once issues with it (it = PIE/non-PIE mixups) I haven't seen any problems with this in fbcode, but its quite likely we're not hitting this path"

Assignee
Assign to
Time tracking