Ich habe eine brandneue Kiste mit cargo new a
und tippte diese in src/lib.rs
:Warum sind Pub-Funktionen, die mit `# [inline]` markiert sind, nicht in der kompilierten Objektdatei vorhanden?
pub fn xor(a: i32, b: i32) -> i32 {
a^b
}
#[inline]
pub fn xor_inline(a: i32, b: i32) -> i32 {
a^b
}
Wenn ich mit cargo build --release
kompilieren, nur die erzeugte .rlib
enthält xor
und nicht 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
ist GNU nm
installiert auf MacOS über Homebrew.)
Ich habe zwei Fragen:
Warum ist
xor_inline
innerhalb der Objektdatei nicht? Ich glaube, dass seine Quelle inrust.metadata.bin
vorhanden sein muss, damit Cross-Crate-Inlining funktioniert, aber warum wird die Plain-Funktion nicht aus der Objektdatei exportiert?Gibt es in
rustc
ein Flag, das ich mitcargo rustc --release -- ...
verwenden kann, um sicherzustellen, dass alle#[inline]
Funktionen in der Objektdatei vorhanden sind? (Vielleicht eine andere--crate-type
oder eine der Fahnen unter-C
?)
(Ich brauche das, weil ich die generierte Assembly für die Funktionen in meine Kiste inspizieren wollen, ohne alle inline entfernen Attribute oder jedes Inline-Verpackung Funktion in einer öffentlichen non-inline Funktion.)
In Verbindung stehend: entsprechend [dieser Antwort] (http://stackoverflow.com/a/30726157/1233251), behält das rlib eine Liste der Funktionen bei, die als inline gekennzeichnet werden. –
* Warum wird die Plain-Funktion nicht aus der Objektdatei exportiert * - Ich nehme an, dass dieser Code einfach genug ist, dass er ** immer ** inline ist, daher kann er nie aufgerufen werden, also gibt es keinen Grund, Objektcode zu haben. * Ich möchte die generierte Baugruppe auf die Funktionen in meiner Kiste untersuchen * - einmal inline, sieht diese Baugruppe vielleicht genauso aus wie die inline und optimierte Baugruppe, daher ist es möglicherweise nicht einmal hilfreich, sie vor dem Inlining zu prüfen. – Shepmaster