< 返回版块

greedyhao 发表于 2021-05-26 23:46

Tags:静态库

尝试了 rust 嵌入式指南中的:little rust with c ,发现生成的静态库里面链接了很多跟我 foo 函数不相关的符号,比如浮点相关的符号。

我希望能去除掉浮点相关的引用,因为会浪费我的 flash 空间,希望有人给与帮助,多谢


问题已解决,是我引用库的工程里面使用了浮点导致的问题

评论区

写评论
作者 greedyhao 2021-05-27 08:57

是的

--
👇
chirsz-ever: 仅仅只是符号的话,不用就会自动优化掉的吧

作者 greedyhao 2021-05-27 08:56

再次感谢。

我今天发现原来是我引用 rust 库的工程里面使用了浮点数,所以才引用了库里面的浮点相关的符号。

--
👇
Pikachu: 一个简单的测试。

// lib.rs
#[no_mangle]
pub extern fn rust_add(a: i32, b: i32) -> i32 {a + b}

#[no_mangle]
pub extern fn rust_minus(a: i32, b: i32) -> i32 {a - b}
# Cargo.toml
...
[lib]
name = "temp"
crate-type = ["staticlib"]
...
// test.c
int rust_add(int a, int b);
int rust_minus(int a, int b);
int main() { rust_add(1, 2); }

首先进行编译。

cargo build --release
gcc -o test.o -c test.c
gcc -o test test.o target/release/libtemp.a -lpthread -ldl

接下来我们可以使用objdump -t查看libtemp.atest.otest的符号表。这里省略具体内容,简单列一下情况。

  1. libtemp.a
  2. 符号表16493行;
  3. 文件大小19123846字节;
  4. 符号表中有rust_addrust_minus
  5. test.o
  6. 符号表16行;
  7. 文件大小1504字节;
  8. 符号表中有rust_add且处于UND状态
  9. test
  10. 符号表64行;
  11. 文件大小8040字节;
  12. 符号表中有rust_add且有值。

结论:尽管libtemp.a的符号表长达16493行,体积也非常大,但是当链接成最终的可执行文件后,未被使用的符号都被丢弃了。所以你完全不用担心静态库的大小问题,因为它不会直接影响最后的可执行文件大小。

Pikachu 2021-05-27 04:05

一个简单的测试。

// lib.rs
#[no_mangle]
pub extern fn rust_add(a: i32, b: i32) -> i32 {a + b}

#[no_mangle]
pub extern fn rust_minus(a: i32, b: i32) -> i32 {a - b}
# Cargo.toml
...
[lib]
name = "temp"
crate-type = ["staticlib"]
...
// test.c
int rust_add(int a, int b);
int rust_minus(int a, int b);
int main() { rust_add(1, 2); }

首先进行编译。

cargo build --release
gcc -o test.o -c test.c
gcc -o test test.o target/release/libtemp.a -lpthread -ldl

接下来我们可以使用objdump -t查看libtemp.atest.otest的符号表。这里省略具体内容,简单列一下情况。

  1. libtemp.a
  2. 符号表16493行;
  3. 文件大小19123846字节;
  4. 符号表中有rust_addrust_minus
  5. test.o
  6. 符号表16行;
  7. 文件大小1504字节;
  8. 符号表中有rust_add且处于UND状态
  9. test
  10. 符号表64行;
  11. 文件大小8040字节;
  12. 符号表中有rust_add且有值。

结论:尽管libtemp.a的符号表长达16493行,体积也非常大,但是当链接成最终的可执行文件后,未被使用的符号都被丢弃了。所以你完全不用担心静态库的大小问题,因为它不会直接影响最后的可执行文件大小。

chirsz-ever 2021-05-27 00:28

仅仅只是符号的话,不用就会自动优化掉的吧

1 共 4 条评论, 1 页