相关疑难解决方法(0)

有没有办法检查Linux上的当前rpath?

我知道可以使用readelf -d <elf> | grep RPATH从shell检查给定的二进制文件,但是可以在一个进程中执行此操作吗?

像(我的完全系统调用):

  /* get a copy of current rpath into buffer */
  sys_get_current_rpath(&buffer);
Run Code Online (Sandbox Code Playgroud)

我正在尝试在代码库中诊断一些可疑的SO链接问题,并且如果可能的话,我希望以这种方式检查RPATH(我宁愿不必生成外部脚本).

linux rpath

68
推荐指数
4
解决办法
6万
查看次数

如何在 Rust 中调用共享库?

我已经用 C 包装器编写了一个 C++ 库,并想从我的 Rust 项目中调用这些函数。然而,当我尝试将我的 Rust 项目链接到 C 库时,我收到了一个很长的错误,并带有注释

\n\n
  note: /usr/bin/ld: cannot find -l../cpp_library/build/libdisplay.so\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试将绝对路径传递给库并收到类似的错误。

\n\n

我的组合项目有以下目录和内容

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cpp_library\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 include\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 display.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 display.cpp\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.cpp\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rust_project\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.rs\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.lock\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n    \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.rs\n
Run Code Online (Sandbox Code Playgroud)\n\n

CMakeLists.txt

\n\n
cmake_minimum_required(VERSION 3.1.0)\nproject(directory_test)\nset(CMAKE_BUILD_TYPE Release)\n\n#Bring the headers into the project\ninclude_directories(include)\n\n\nset(SOURCES "src/display.cpp")\n\n#Generate the shared library from the sources\nadd_library(display SHARED ${SOURCES})\nadd_executable(display_test "src/main.cpp" ${SOURCES})\n
Run Code Online (Sandbox Code Playgroud)\n\n

显示.h

\n\n
extern "C" {\n    void display();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n …

c c++ ffi rust

5
推荐指数
0
解决办法
3391
查看次数

如何在构建脚本中指定链接器标志/参数?

我正在使用Rust,bindgen和一个构建脚本来对库进行一些FFI绑定。

该库是使用OpenMP构建的,因此在链接它时,通常会将-fopenmp标志传递给编译器。

build.rs当Cargo构建库时,如何设置此标志?

当前,使用Cargo构建失败,而failing命令类似:

cc -Wl,--as-needed -Wl,-z,noexecstack -m64 -l gomp -l stdc++
...skipping dozens of paths/files...
 -Wl,-Bdynamic -l dl -l rt -l pthread -l gcc_s -l c -l m -l rt -l pthread -l util
Run Code Online (Sandbox Code Playgroud)

失败并显示数百个undefined reference to 'GOMP_parallel_end'错误。

使用-fopenmp手动添加的标志重新运行上面生成的命令将成功。

我可以RUSTFLAGS='-C link-args=-fopenmp'在编译之前使用指定标志,但是有没有一种从内部指定标志的方法build.rs?

ffi rust

4
推荐指数
2
解决办法
1986
查看次数

如何仅使用 rustc 而不是货物链接动态 Rust 库?

我的main.rs样子

// #[link(name = "lib")]
extern "C" {
    fn hello();
}

fn main() {
    unsafe {
        hello();
    }
}
Run Code Online (Sandbox Code Playgroud)

并且lib.rs:

#[no_mangle]
pub fn hello() {
    println!("Hello, World!");
}
Run Code Online (Sandbox Code Playgroud)

我已经编译lib.rs使用rustc --crate-type=cdylib lib.rs -o lib.so

如何链接lib.so到rustc main.rs命令?

linker ffi dynamic-linking rust

4
推荐指数
1
解决办法
2635
查看次数

使用prefer-dynamic时无法执行hello world项目

我在一个非常简单的项目hello world上玩Rust的编译选项:

fn main() {
    println!("Hello, world!");
}
Run Code Online (Sandbox Code Playgroud)

我正在使用这一行编译,prefer-dynamic是唯一值得注意的选项:

rustc main.rs -o ./build/rci -C prefer-dynamic
Run Code Online (Sandbox Code Playgroud)

它做得很好,直到我做了一些改变然后它没有.现在如果我尝试完全按照上面的方式编译代码,我得到这个输出:

./build/rci: error while loading shared libraries: libstd-2ddb28df747fcb8c.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

ldd的输出是:

linux-vdso.so.1 =>  (0x00007ffd321a4000)
libstd-2ddb28df747fcb8c.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f52eaef3000)
/lib64/ld-linux-x86-64.so.2 (0x000055f0f6251000)
Run Code Online (Sandbox Code Playgroud)

这是在Ubuntu 17.04上使用Rust 1.15.1.

ubuntu dynamic-linking rust

3
推荐指数
1
解决办法
303
查看次数

标签 统计

rust ×4

ffi ×3

dynamic-linking ×2

c ×1

c++ ×1

linker ×1

linux ×1

rpath ×1

ubuntu ×1