TechTalk

如何识别elf可执行文件是golang或者rust语言编译

字数统计: 191阅读时长: 1 min
2021/03/17

如果elf是golang语言编写后编译生成,那么elf存在如下的段信息:

1
2
3
4
5
6
7
#readelf --sections xxx
[ 6] .gosymtab PROGBITS 00000000029523d0 025523d0
0000000000000000 0000000000000000 A 0 0 1
[ 7] .gopclntab PROGBITS 00000000029523e0 025523e0
0000000000faeca1 0000000000000000 A 0 0 32
[ 8] .go.buildinfo PROGBITS 0000000003902000 03502000
0000000000000020 0000000000000000 WA 0 0 16

当然也可以通过其他的方式判断,例如strings后的结果存在go的函数。
而通过rust编译后的程序再elf段上没有那么明显的特征,只能通过strings后看到有众多的rustc函数特征:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#strings hello | grep rust
clang LLVM (rustc version 1.50.0 (cb75ad5db 2021-02-10))
and_then<&str,rustc_demangle::Demangle,closure-0>
ok<rustc_demangle::Demangle,rustc_demangle::TryDemangleError>
as_ref<rustc_demangle::Demangle>
map<&rustc_demangle::Demangle,&str,closure-0>
_ZN3std10sys_common9backtrace18rust_backtrace_env17h9040d0471b710635E
rust_backtrace_env
_ZN3std10sys_common9backtrace18rust_backtrace_env28_$u7b$$u7b$closure$u7d$$u7d$17haa6a1a790dc380c8E
rust_panic_without_hook
drop_in_place<std::panicking::rust_panic_without_hook::RewrapBox>
_ZN3std10sys_common9backtrace26__rust_end_short_backtrace17h0903517b9709bc89E
__rust_end_short_backtrace<closure-0,!>
_ZN3std10sys_common9backtrace26__rust_end_short_backtrace17hb9f0aa9a78e885a0E
rust_oom
__rust_drop_panic
__rust_foreign_exception
rust_begin_unwind
_ZN3std9panicking20rust_panic_with_hook17hb27ea14285131c61E
rust_panic_with_hook

CATALOG