【发布时间】:2017-02-20 17:45:51
【问题描述】:
我用cargo new a 创建了一个全新的板条箱,并在src/lib.rs 中输入了这个:
pub fn xor(a: i32, b: i32) -> i32 {
a ^ b
}
#[inline]
pub fn xor_inline(a: i32, b: i32) -> i32 {
a ^ b
}
当我用cargo build --release 编译时,生成的.rlib 只包含xor 而不是xor_inline:
$ gnm -D -C target/release/deps/liba-6a3c2798185fafee.rlib
gnm: __.SYMDEF: File format not recognized
a-6a3c2798185fafee.0.o:
0000000000000000 T a::xor::hf0d97103d53d3286
gnm: rust.metadata.bin: File format not recognized
gnm: a-6a3c2798185fafee.0.bytecode.deflate: File format not recognized
(gnm 是通过 Homebrew 在 MacOS 上安装的 GNU nm。)
我有两个问题:
为什么
xor_inline不在目标文件中?我相信它的来源必须存在于rust.metadata.bin中,这样才能跨箱内联工作,但是为什么没有从目标文件中导出普通函数?rustc中是否有任何标志可以与cargo rustc --release -- ...一起使用以确保所有#[inline]函数都存在于目标文件中? (可能是不同的--crate-type或-C下的标志之一?)
(我需要这个,因为我想检查生成的程序集以查找我的 crate 中的函数,而不必删除所有内联属性或将每个内联函数包装在公共非内联函数中。)
【问题讨论】:
-
相关:根据this answer,rlib 保存了一个标记为内联的函数列表。
-
为什么没有从目标文件中导出普通函数——我假设这段代码很简单,它总是内联,因此它永远不能被调用,所以没有理由拥有目标代码。 我想检查生成的程序集以了解我的 crate 中的功能 - 一旦内联,该程序集可能看起来或可能根本不像内联和优化的程序集,因此在内联之前检查它甚至可能没有用.
标签: rust