feat(analysis): implement Golang ABI calling conventions and prologue voting

- Define golang (ABIInternal) and golang_abi0 calling conventions in SDB for x86-64, ARM64, and x86-32
- Implement statistical prologue voting heuristic across sampled Go functions to automatically distinguish ABIInternal from ABI0 on stripped/obfuscated binaries
- Automatically assign detected Go calling convention to recovered sym.go.* functions
- Filter compiler-generated wrapper symbols (.abi0, .abiinternal, ..inittask, type:*) from deep function analysis
- Linked to rz-ghidra PR for SLEIGH decompiler prototype integration
This commit is contained in:
doomedraven
2026-10-11 15:58:31 +08:00
committed by NOT XVilka
parent f52a6681ce
commit 61f99aa3f7
12 changed files with 526 additions and 317 deletions
+22
View File
@@ -27,3 +27,25 @@ cc.swift.maxargs=8
cc.swift.self=x20
cc.swift.error=x21
cc.swift.ret=x0
golang=cc
cc.golang.arg0=x0
cc.golang.arg1=x1
cc.golang.arg2=x2
cc.golang.arg3=x3
cc.golang.arg4=x4
cc.golang.arg5=x5
cc.golang.arg6=x6
cc.golang.arg7=x7
cc.golang.arg8=x8
cc.golang.arg9=x9
cc.golang.arg10=x10
cc.golang.arg11=x11
cc.golang.arg12=x12
cc.golang.arg13=x13
cc.golang.arg14=x14
cc.golang.arg15=x15
cc.golang.argn=stack
cc.golang.maxargs=16
cc.golang.self=x28
cc.golang.ret=x0
+5
View File
@@ -49,3 +49,8 @@ cc.watcom.maxargs=4
pascal=cc
cc.pascal.argn=stack_rev
cc.pascal.maxargs=0
golang=cc
cc.golang.argn=stack
cc.golang.maxargs=0
cc.golang.ret=eax
+20
View File
@@ -50,3 +50,23 @@ cc.amd64syscall.arg4=r8
cc.amd64syscall.arg5=r9
cc.amd64syscall.maxargs=6
cc.amd64syscall.ret=rax
golang=cc
cc.golang.arg0=rax
cc.golang.arg1=rbx
cc.golang.arg2=rcx
cc.golang.arg3=rdi
cc.golang.arg4=rsi
cc.golang.arg5=r8
cc.golang.arg6=r9
cc.golang.arg7=r10
cc.golang.arg8=r11
cc.golang.argn=stack
cc.golang.maxargs=9
cc.golang.ret=rax
cc.golang.self=r14
golang_abi0=cc
cc.golang_abi0.argn=stack
cc.golang_abi0.maxargs=0
cc.golang_abi0.ret=rax
+2 -2
View File
@@ -45,7 +45,7 @@ struct.runtime.iface.data=void*,4,0
hmap=struct
struct.hmap=count,flags,B,noverflow,hash0,buckets,oldbuckets,nevacuate,extra
struct.hmap.count=int,0,0
struct.hmap.count=int32_t,0,0
struct.hmap.flags=uint8_t,4,0
struct.hmap.B=uint8_t,5,0
struct.hmap.noverflow=uint16_t,6,0
@@ -57,7 +57,7 @@ struct.hmap.extra=void*,24,0
runtime.hmap=struct
struct.runtime.hmap=count,flags,B,noverflow,hash0,buckets,oldbuckets,nevacuate,extra
struct.runtime.hmap.count=int,0,0
struct.runtime.hmap.count=int32_t,0,0
struct.runtime.hmap.flags=uint8_t,4,0
struct.runtime.hmap.B=uint8_t,5,0
struct.runtime.hmap.noverflow=uint16_t,6,0
+2 -2
View File
@@ -45,7 +45,7 @@ struct.runtime.iface.data=void*,8,0
hmap=struct
struct.hmap=count,flags,B,noverflow,hash0,buckets,oldbuckets,nevacuate,extra
struct.hmap.count=int,0,0
struct.hmap.count=int64_t,0,0
struct.hmap.flags=uint8_t,8,0
struct.hmap.B=uint8_t,9,0
struct.hmap.noverflow=uint16_t,10,0
@@ -57,7 +57,7 @@ struct.hmap.extra=void*,40,0
runtime.hmap=struct
struct.runtime.hmap=count,flags,B,noverflow,hash0,buckets,oldbuckets,nevacuate,extra
struct.runtime.hmap.count=int,0,0
struct.runtime.hmap.count=int64_t,0,0
struct.runtime.hmap.flags=uint8_t,8,0
struct.runtime.hmap.B=uint8_t,9,0
struct.runtime.hmap.noverflow=uint16_t,10,0
+129 -5
View File
@@ -512,12 +512,125 @@ static ut32 core_recover_golang_functions_go_1_2(RzCore *core, GoPcLnTab *pclnta
return num_syms;
}
static bool analyse_golang_symgo_function(RzFlagItem *fi, void *user) {
RzCore *core = (RzCore *)user;
rz_core_analysis_fcn(core, fi->offset, UT64_MAX, RZ_ANALYSIS_XREF_TYPE_NULL, 1);
#define GO_ABI_PROLOGUE_WINDOW 24
#define GO_ABI_MAX_SAMPLES 512
/**
* \brief Checks if a Go symbol is compiler boilerplate (ABI wrappers, closures, inittasks).
*/
static bool rz_golang_is_compiler_wrapper_symbol(const char *name) {
if (RZ_STR_ISEMPTY(name)) {
return true;
}
if (!strncmp(name, "sym.go.", 7)) {
name += 7;
}
return strstr(name, ".abi0") ||
strstr(name, ".abiinternal") ||
strstr(name, ".deferwrap") ||
strstr(name, "..inittask") ||
!strncmp(name, "type:", 5) ||
!strncmp(name, "go:", 3);
}
/**
* \brief Sample a function's prologue to vote on register ABI (R14 holds g) vs stack ABI (g from TLS).
*/
static void rz_golang_vote_abi_prologue(RzIO *io, ut64 func_addr, ut32 *reg_votes, ut32 *stack_votes) {
ut8 code[GO_ABI_PROLOGUE_WINDOW + 8] = { 0 };
if (0 > rz_io_nread_at(io, func_addr, code, sizeof(code))) {
return;
}
for (ut32 k = 0; k <= GO_ABI_PROLOGUE_WINDOW; k++) {
// 49 3B 66 10 / 4D 3B 66 10 (CMPQ SP|R12, 16(R14)) -> Register ABI (R14 holds g)
if ((code[k] == 0x49 || code[k] == 0x4d) && code[k + 1] == 0x3b && code[k + 2] == 0x66 && code[k + 3] == 0x10) {
(*reg_votes)++;
return;
}
// 64|65 48|4C 8B /r with SIB 0x25 (MOVQ FS|GS:[disp32], reg) -> Stack ABI (g loaded from TLS)
if ((code[k] == 0x64 || code[k] == 0x65) && (code[k + 1] == 0x48 || code[k + 1] == 0x4c) && code[k + 2] == 0x8b &&
(code[k + 3] & 0xc7) == 0x04 && code[k + 4] == 0x25) {
(*stack_votes)++;
return;
}
}
}
typedef struct {
RzCore *core;
ut32 samples_count;
ut32 reg_votes;
ut32 stack_votes;
} GolangVoteCtx;
static bool rz_golang_sample_flag_for_abi(RzFlagItem *fi, void *user) {
GolangVoteCtx *ctx = (GolangVoteCtx *)user;
if (rz_golang_is_compiler_wrapper_symbol(fi->name)) {
return true;
}
if (ctx->samples_count >= GO_ABI_MAX_SAMPLES) {
return false;
}
ctx->samples_count++;
rz_golang_vote_abi_prologue(ctx->core->io, fi->offset, &ctx->reg_votes, &ctx->stack_votes);
return true;
}
typedef struct {
RzCore *core;
const char *cc;
} GolangAnalyseCtx;
static bool analyse_golang_symgo_function(RzFlagItem *fi, void *user) {
GolangAnalyseCtx *ctx = (GolangAnalyseCtx *)user;
RzCore *core = ctx->core;
if (rz_golang_is_compiler_wrapper_symbol(fi->name)) {
return true;
}
rz_core_analysis_fcn(core, fi->offset, UT64_MAX, RZ_ANALYSIS_XREF_TYPE_NULL, 1);
if (ctx->cc) {
RzAnalysisFunction *fcn = rz_analysis_get_function_at(core->analysis, fi->offset);
if (fcn) {
fcn->cc = ctx->cc;
}
}
return true;
}
static const char *golang_detect_cc(RzCore *core, const RzSpace *symbols) {
const char *asm_arch = rz_config_get(core->config, "asm.arch");
ut32 asm_bits = rz_config_get_i(core->config, "asm.bits");
if (RZ_STR_ISEMPTY(asm_arch) || asm_bits == 32 || strcmp(asm_arch, "x86") != 0) {
return "golang";
}
// Run statistical prologue vote across sampled functions to determine active ABI
GolangVoteCtx vote_ctx = {
.core = core,
.samples_count = 0,
.reg_votes = 0,
.stack_votes = 0
};
rz_flag_foreach_space_glob(core->flags, "sym.go.*", symbols, rz_golang_sample_flag_for_abi, &vote_ctx);
ut32 total_votes = vote_ctx.reg_votes + vote_ctx.stack_votes;
if (total_votes >= 8 && vote_ctx.stack_votes * 10 >= total_votes * 9) {
RZ_LOG_INFO("Golang ABI prologue vote: Stack ABI (votes: %u reg, %u stack)\n",
vote_ctx.reg_votes, vote_ctx.stack_votes);
return "golang_abi0";
}
if (total_votes >= 8 && vote_ctx.reg_votes * 10 >= total_votes * 9) {
RZ_LOG_INFO("Golang ABI prologue vote: Register ABI (votes: %u reg, %u stack)\n",
vote_ctx.reg_votes, vote_ctx.stack_votes);
}
return "golang";
}
/**
* \brief Analyse Golang symbols matching "sym.go.*"
* \param core RzCore Pointer
@@ -527,7 +640,18 @@ static void analyse_golang_symbols(RzCore *core) {
if (!symbols) {
return;
}
rz_flag_foreach_space_glob(core->flags, "sym.go.*", symbols, analyse_golang_symgo_function, core);
const char *detected_cc = golang_detect_cc(core, symbols);
if (detected_cc && !rz_analysis_cc_exist(core->analysis, detected_cc)) {
detected_cc = NULL;
}
RzStrConstPool *cpool = rz_analysis_get_const_pool(core->analysis);
GolangAnalyseCtx actx = {
.core = core,
.cc = (detected_cc && cpool) ? rz_str_constpool_get(cpool, detected_cc) : NULL
};
rz_flag_foreach_space_glob(core->flags, "sym.go.*", symbols, analyse_golang_symgo_function, &actx);
}
/**
@@ -656,10 +780,10 @@ RZ_API bool rz_core_analysis_recover_golang_functions(RzCore *core) {
ut32 num_libs = sort_recovered_library(core);
rz_core_notify_done(core, "Recovered %u symbols and saved them at sym.go.*", num_syms);
rz_core_notify_done(core, "Recovered %u go packages", num_libs);
rz_golang_load_types(core);
rz_core_notify_begin(core, "Analyze all flags starting with sym.go. (aF @@f:sym.go.*)");
analyse_golang_symbols(core);
rz_core_notify_done(core, "Analyze all flags starting with sym.go. (aF @@f:sym.go.*)");
rz_golang_load_types(core);
return true;
}
+2 -307
View File
@@ -458,313 +458,6 @@ unicode/utf8
EOF
RUN
NAME=Resolve all symbols on a linux go1.16 binary (arm32)
FILE=bins/golang/btcctl-linux-armv7-v0.22.0-beta
TIMEOUT=1200
CMDS=<<EOF
aalg
fl~sym.go.~?
pdfs @ main ~str.
# Attempt to get some reference strings when the count changes with izq.
echo HEAD
izq~:..10
echo TAIL
izq~:-10..
izq~?
ilq
EOF
EXPECT=<<EOF
5124
0x00270aac str.Failed_to_read_data_from_stdin:__v
0x00270d70 str.s_command:__v
0x00270db8 str.1.0
0x002710ec str.Failed_to_unmarshal_result:__v
0x0027124c str.Failed_to_format_result:__v
0x0027140c str.s_command:__v__code:__s
0x002714b0 str.The___s__command_can_only_be_used_via_websockets
0x00271580 str.Unrecognized_command___s
0x00271608 str.No_command_specified
0x0027186c str.Chain_Server_Commands:DEBUG_HTTP2
0x0027187c str.Wallet_Server_Commands____wallet_:
0x00271bbc str.cannot_use__wallet_with__regtest__btcwallet_not_yet_compatible_with_regtest
0x00271e10 str.localhost
0x00272018 str.Use__s__h_to_show_options
0x002720ec str.btcwallet.conf
0x00272188 str.Error_creating_a_default_config_file:__v
0x00272618 str.s:_Multiple_network_params_can_t_be_used_together____choose_one
0x0027271c str.Error_parsing_config_file:__v
0x002727f8 str.btcd.conf
0x00272c0c str.m___s_rpcuser_____s
0x00272c60 str.m___s_rpcpass_____s
0x00272cb4 str.m___s_notls__0_1___:_s
0x00272e4c str.rpcuser__s_rpcpass__s
0x00272edc str.notls__s
0x00273460 str.http
0x0027347c str.:
0x00273514 str.POST
0x00273574 str.Content_Type
0x002735b4 str.application_json
0x0027373c str.error_reading_json_reply:__v
0x00273834 str.d__s
0x002738bc str.s
0x00273a58 str.https
0x00273b18 str.d._d._d
0x00273b50 str.beta
0x00273c20 str.s__s
0x00273d74 str.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0x00273efc str.linux
0x00273f0c str.btcd
0x00273f50 str.linux
0x00273f60 str.btcctl
0x00273fa4 str.linux
0x00273fb4 str.btcwallet
0x0027401c str.btcctl.conf
0x00274090 str.rpc.cert
0x00274104 str.rpc.cert
HEAD
0x280a6f 4 4 main
0x280a77 4 4 sort
0x280a7f 4 4 sync
0x280a87 4 4 time
0x280a8e 4 4 *int
0x280a95 4 4 AAAA
0x280a9c 4 4 Add2
0x280aa3 4 4 Addr
0x280aaa 4 4 Args
0x280ab1 4 4 Atim
TAIL
0x2e9fd2 5 5 %s+%s
0x2fe095 63 63 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-
0x2e9e6b 5 5 btcdc
0x2e9e6b 4 4 btcd
0x2ea4ca 5 5 btcct
0x2ea4ca 6 6 btcctl
0x2eb50f 5 5 btcwa
0x2eb50f 9 9 btcwallet
0x2ec40d 11 11 btcctl.conf
0x2eb053 8 8 rpc.cert
14315
bufio
bytes
compress/flate
compress/gzip
compress/zlib
container/list
context
crypto
crypto/aes
crypto/cipher
crypto/des
crypto/dsa
crypto/ecdsa
crypto/ed25519
crypto/ed25519/internal/edwards25519
crypto/elliptic
crypto/hmac
crypto/internal/randutil
crypto/md5
crypto/rand
crypto/rc4
crypto/rsa
crypto/sha1
crypto/sha256
crypto/sha512
crypto/tls
crypto/x509
crypto/x509/pkix
encoding/asn1
encoding/base64
encoding/binary
encoding/hex
encoding/json
encoding/pem
errors
fmt
github.com/btcsuite/btcd/btcec
github.com/btcsuite/btcd/btcjson
github.com/btcsuite/btcd/chaincfg
github.com/btcsuite/btcd/chaincfg/chainhash
github.com/btcsuite/btcd/txscript
github.com/btcsuite/btcd/wire
github.com/btcsuite/btclog
github.com/btcsuite/btcutil
github.com/btcsuite/btcutil/base58
github.com/btcsuite/go-socks/socks
github.com/jessevdk/go-flags
golang.org/x/crypto/chacha20
golang.org/x/crypto/chacha20poly1305
golang.org/x/crypto/cryptobyte
golang.org/x/crypto/curve25519
golang.org/x/crypto/hkdf
golang.org/x/crypto/poly1305
golang.org/x/crypto/ripemd160
golang.org/x/net/dns/dnsmessage
golang.org/x/net/http/httpguts
golang.org/x/net/http/httpproxy
golang.org/x/net/http2/hpack
golang.org/x/net/idna
golang.org/x/text/secure/bidirule
golang.org/x/text/transform
golang.org/x/text/unicode/bidi
golang.org/x/text/unicode/norm
hash/adler32
hash/crc32
internal/bytealg
internal/cpu
internal/fmtsort
internal/oserror
internal/poll
internal/reflectlite
internal/singleflight
internal/syscall/unix
internal/testlog
io
io/fs
io/ioutil
log
math
math/big
math/bits
math/rand
mime
mime/multipart
net
net/http
net/http/internal
net/textproto
net/url
os
os/user
path
path/filepath
reflect
regexp
regexp/syntax
runtime
runtime/debug
runtime/internal/atomic
sort
strconv
strings
sync
sync/atomic
syscall
time
unicode
unicode/utf16
unicode/utf8
EOF
RUN
NAME=Resolve all symbols on a linux go1.16 binary (arm64)
FILE=bins/golang/btcctl-linux-arm64-v0.22.0-beta
CMDS=<<EOF
aalg
fl~sym.go.~?
pdfs @ main ~str.
# Attempt to get some reference strings when the count changes with izq.
echo HEAD
izq~:..10
echo TAIL
izq~:-10..
izq~?
EOF
EXPECT=<<EOF
5070
0x0026b000 str.s_command:__v
0x0026b04c str.1.0
0x0026b310 str.tls:_invalid_server_key_share
0x0026b314 str.Failed_to_unmarshal_result:__v
0x0026b444 str.Failed_to_format_result:__v
0x0026b5dc str.s_command:__v__code:__s
0x0026b730 str.Failed_to_read_data_from_stdin:__v
0x0026b884 str.Not_enough_lines_provided_on_stdin
0x0026b998 str.The___s__command_can_only_be_used_via_websockets
0x0026b9d0 str.Specify__l_to_list_available_commands
0x0026ba70 str.Unrecognized_command___s
0x0026baa8 str.Specify__l_to_list_available_commands
0x0026bb00 str.No_command_specified
0x0026bc28 str.Chain_Server_Commands:DEBUG_HTTP2
0x0026bc3c str.Wallet_Server_Commands____wallet_:
0x0026bf1c str.testnet3
0x0026bf40 str.18334
0x0026c030 str.simnet
0x0026c054 str.18556
0x0026c064 str.regtest
0x0026c084 str.18334
0x0026c090 str.cannot_use__wallet_with__regtest__btcwallet_not_yet_compatible_with_regtest
0x0026c100 str.8334
0x0026c2c8 str.localhost
0x0026c2d0 str.localhost
0x0026c520 str.Use__s__h_to_show_options
0x0026c5f4 str.btcwallet.conf
0x0026c688 str.Error_creating_a_default_config_file:__v
0x0026c8ac str.testnet3
0x0026c8b4 str.mainnet
0x0026c8c4 str.simnet
0x0026c8d4 str.regtest
0x0026cad4 str.loadConfig
0x0026cae0 str.profilealloc_called_without_a_P_or_outside_bootstrapping
0x0026cae4 str.s:_Multiple_network_params_can_t_be_used_together____choose_one
0x0026cbd0 str.tls:_invalid_server_key_share
0x0026cbd4 str.Error_parsing_config_file:__v
0x0026ccb8 str.btcd.conf
0x0026cd6c str.version
0x0026cec4 str.The_special_parameter_____indicates_that_a_parameter_should_be_read_from_the_next_unread_line_from_standard_input.
0x0026d0a8 str.m___s_rpcuser_____s
0x0026d0fc str.m___s_rpcpass_____s
0x0026d150 str.m___s_notls__0_1___:_s
0x0026d2e0 str.rpcuser__s_rpcpass__s
0x0026d368 str.notls__s
0x0026d900 str.http
0x0026d908 str.https
0x0026d90c str.http
0x0026d928 str.:
0x0026d9c4 str.POST
0x0026da28 str.Content_Type
0x0026da70 str.application_json
0x0026dbe8 str.error_reading_json_reply:__v
0x0026dcec str.d__s
0x0026dd70 str.s
0x0026df84 str.d._d._d
0x0026dfc0 str.beta
0x0026e0a0 str.s__s
0x0026e1dc str.profilealloc_called_without_a_P_or_outside_bootstrapping
0x0026e1e0 str.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0x0026e370 str.linux
0x0026e384 str.btcd
0x0026e3d0 str.linux
0x0026e3e4 str.btcctl
0x0026e430 str.linux
0x0026e444 str.btcwallet
0x0026e4b8 str.btcctl.conf
0x0026e53c str.rpc.cert
0x0026e5c0 str.rpc.cert
HEAD
0x270767 4 4 main
0x27076f 4 4 sort
0x270777 4 4 sync
0x27077f 4 4 time
0x270786 4 4 *int
0x27078d 4 4 AAAA
0x270794 4 4 Add2
0x27079b 4 4 Addr
0x2707a2 4 4 Args
0x2707a9 4 4 Atim
TAIL
0x306b9a 5 5 %s+%s
0x31abbf 63 63 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-
0x306a26 5 5 btcdc
0x306a26 4 4 btcd
0x30708d 5 5 btcct
0x30708d 6 6 btcctl
0x308060 5 5 btcwa
0x308060 9 9 btcwallet
0x308f22 11 11 btcctl.conf
0x307bd6 8 8 rpc.cert
14368
EOF
RUN
NAME=Resolve all symbols on a stripped mach0 go1.18 binary (arm64)
FILE=bins/golang/hello.mach0.stripped
@@ -1185,6 +878,7 @@ NAME=Resolve all symbols on a stripped linux go1.21 binary
FILE=bins/golang/go-re-sample-linux-amd64-go121
CMDS=<<EOF
aalg
afc @ sym.main.main
tc stringStruct
fl~sym.go.~?
pdfs @ main ~str.
@@ -1196,6 +890,7 @@ izq~:-10..
izq~?
EOF
EXPECT=<<EOF
golang
struct stringStruct {
char *str;
size_t len;
+308
View File
@@ -0,0 +1,308 @@
NAME=Resolve all symbols on a linux go1.16 binary (arm32)
FILE=bins/golang/btcctl-linux-armv7-v0.22.0-beta
TIMEOUT=1200
CMDS=<<EOF
aalg
fl~sym.go.~?
pdfs @ main ~str.
# Attempt to get some reference strings when the count changes with izq.
echo HEAD
izq~:..10
echo TAIL
izq~:-10..
izq~?
ilq
EOF
EXPECT=<<EOF
5124
0x00270aac str.Failed_to_read_data_from_stdin:__v
0x00270d70 str.s_command:__v
0x00270db8 str.1.0
0x002710ec str.Failed_to_unmarshal_result:__v
0x0027124c str.Failed_to_format_result:__v
0x0027140c str.s_command:__v__code:__s
0x002714b0 str.The___s__command_can_only_be_used_via_websockets
0x00271580 str.Unrecognized_command___s
0x00271608 str.No_command_specified
0x0027186c str.Chain_Server_Commands:DEBUG_HTTP2
0x0027187c str.Wallet_Server_Commands____wallet_:
0x00271bbc str.cannot_use__wallet_with__regtest__btcwallet_not_yet_compatible_with_regtest
0x00271e10 str.localhost
0x00272018 str.Use__s__h_to_show_options
0x002720ec str.btcwallet.conf
0x00272188 str.Error_creating_a_default_config_file:__v
0x00272618 str.s:_Multiple_network_params_can_t_be_used_together____choose_one
0x0027271c str.Error_parsing_config_file:__v
0x002727f8 str.btcd.conf
0x00272c0c str.m___s_rpcuser_____s
0x00272c60 str.m___s_rpcpass_____s
0x00272cb4 str.m___s_notls__0_1___:_s
0x00272e4c str.rpcuser__s_rpcpass__s
0x00272edc str.notls__s
0x00273460 str.http
0x0027347c str.:
0x00273514 str.POST
0x00273574 str.Content_Type
0x002735b4 str.application_json
0x0027373c str.error_reading_json_reply:__v
0x00273834 str.d__s
0x002738bc str.s
0x00273a58 str.https
0x00273b18 str.d._d._d
0x00273b50 str.beta
0x00273c20 str.s__s
0x00273d74 str.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0x00273efc str.linux
0x00273f0c str.btcd
0x00273f50 str.linux
0x00273f60 str.btcctl
0x00273fa4 str.linux
0x00273fb4 str.btcwallet
0x0027401c str.btcctl.conf
0x00274090 str.rpc.cert
0x00274104 str.rpc.cert
HEAD
0x280a6f 4 4 main
0x280a77 4 4 sort
0x280a7f 4 4 sync
0x280a87 4 4 time
0x280a8e 4 4 *int
0x280a95 4 4 AAAA
0x280a9c 4 4 Add2
0x280aa3 4 4 Addr
0x280aaa 4 4 Args
0x280ab1 4 4 Atim
TAIL
0x2e9fd2 5 5 %s+%s
0x2fe095 63 63 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-
0x2e9e6b 5 5 btcdc
0x2e9e6b 4 4 btcd
0x2ea4ca 5 5 btcct
0x2ea4ca 6 6 btcctl
0x2eb50f 5 5 btcwa
0x2eb50f 9 9 btcwallet
0x2ec40d 11 11 btcctl.conf
0x2eb053 8 8 rpc.cert
14315
bufio
bytes
compress/flate
compress/gzip
compress/zlib
container/list
context
crypto
crypto/aes
crypto/cipher
crypto/des
crypto/dsa
crypto/ecdsa
crypto/ed25519
crypto/ed25519/internal/edwards25519
crypto/elliptic
crypto/hmac
crypto/internal/randutil
crypto/md5
crypto/rand
crypto/rc4
crypto/rsa
crypto/sha1
crypto/sha256
crypto/sha512
crypto/tls
crypto/x509
crypto/x509/pkix
encoding/asn1
encoding/base64
encoding/binary
encoding/hex
encoding/json
encoding/pem
errors
fmt
github.com/btcsuite/btcd/btcec
github.com/btcsuite/btcd/btcjson
github.com/btcsuite/btcd/chaincfg
github.com/btcsuite/btcd/chaincfg/chainhash
github.com/btcsuite/btcd/txscript
github.com/btcsuite/btcd/wire
github.com/btcsuite/btclog
github.com/btcsuite/btcutil
github.com/btcsuite/btcutil/base58
github.com/btcsuite/go-socks/socks
github.com/jessevdk/go-flags
golang.org/x/crypto/chacha20
golang.org/x/crypto/chacha20poly1305
golang.org/x/crypto/cryptobyte
golang.org/x/crypto/curve25519
golang.org/x/crypto/hkdf
golang.org/x/crypto/poly1305
golang.org/x/crypto/ripemd160
golang.org/x/net/dns/dnsmessage
golang.org/x/net/http/httpguts
golang.org/x/net/http/httpproxy
golang.org/x/net/http2/hpack
golang.org/x/net/idna
golang.org/x/text/secure/bidirule
golang.org/x/text/transform
golang.org/x/text/unicode/bidi
golang.org/x/text/unicode/norm
hash/adler32
hash/crc32
internal/bytealg
internal/cpu
internal/fmtsort
internal/oserror
internal/poll
internal/reflectlite
internal/singleflight
internal/syscall/unix
internal/testlog
io
io/fs
io/ioutil
log
math
math/big
math/bits
math/rand
mime
mime/multipart
net
net/http
net/http/internal
net/textproto
net/url
os
os/user
path
path/filepath
reflect
regexp
regexp/syntax
runtime
runtime/debug
runtime/internal/atomic
sort
strconv
strings
sync
sync/atomic
syscall
time
unicode
unicode/utf16
unicode/utf8
EOF
RUN
NAME=Resolve all symbols on a linux go1.16 binary (arm64)
FILE=bins/golang/btcctl-linux-arm64-v0.22.0-beta
TIMEOUT=1200
CMDS=<<EOF
aalg
fl~sym.go.~?
pdfs @ main ~str.
# Attempt to get some reference strings when the count changes with izq.
echo HEAD
izq~:..10
echo TAIL
izq~:-10..
izq~?
EOF
EXPECT=<<EOF
5070
0x0026b000 str.s_command:__v
0x0026b04c str.1.0
0x0026b310 str.tls:_invalid_server_key_share
0x0026b314 str.Failed_to_unmarshal_result:__v
0x0026b444 str.Failed_to_format_result:__v
0x0026b5dc str.s_command:__v__code:__s
0x0026b730 str.Failed_to_read_data_from_stdin:__v
0x0026b884 str.Not_enough_lines_provided_on_stdin
0x0026b998 str.The___s__command_can_only_be_used_via_websockets
0x0026b9d0 str.Specify__l_to_list_available_commands
0x0026ba70 str.Unrecognized_command___s
0x0026baa8 str.Specify__l_to_list_available_commands
0x0026bb00 str.No_command_specified
0x0026bc28 str.Chain_Server_Commands:DEBUG_HTTP2
0x0026bc3c str.Wallet_Server_Commands____wallet_:
0x0026bf1c str.testnet3
0x0026bf40 str.18334
0x0026c030 str.simnet
0x0026c054 str.18556
0x0026c064 str.regtest
0x0026c084 str.18334
0x0026c090 str.cannot_use__wallet_with__regtest__btcwallet_not_yet_compatible_with_regtest
0x0026c100 str.8334
0x0026c2c8 str.localhost
0x0026c2d0 str.localhost
0x0026c520 str.Use__s__h_to_show_options
0x0026c5f4 str.btcwallet.conf
0x0026c688 str.Error_creating_a_default_config_file:__v
0x0026c8ac str.testnet3
0x0026c8b4 str.mainnet
0x0026c8c4 str.simnet
0x0026c8d4 str.regtest
0x0026cad4 str.loadConfig
0x0026cae0 str.profilealloc_called_without_a_P_or_outside_bootstrapping
0x0026cae4 str.s:_Multiple_network_params_can_t_be_used_together____choose_one
0x0026cbd0 str.tls:_invalid_server_key_share
0x0026cbd4 str.Error_parsing_config_file:__v
0x0026ccb8 str.btcd.conf
0x0026cd6c str.version
0x0026cec4 str.The_special_parameter_____indicates_that_a_parameter_should_be_read_from_the_next_unread_line_from_standard_input.
0x0026d0a8 str.m___s_rpcuser_____s
0x0026d0fc str.m___s_rpcpass_____s
0x0026d150 str.m___s_notls__0_1___:_s
0x0026d2e0 str.rpcuser__s_rpcpass__s
0x0026d368 str.notls__s
0x0026d900 str.http
0x0026d908 str.https
0x0026d90c str.http
0x0026d928 str.:
0x0026d9c4 str.POST
0x0026da28 str.Content_Type
0x0026da70 str.application_json
0x0026dbe8 str.error_reading_json_reply:__v
0x0026dcec str.d__s
0x0026dd70 str.s
0x0026df84 str.d._d._d
0x0026dfc0 str.beta
0x0026e0a0 str.s__s
0x0026e1dc str.profilealloc_called_without_a_P_or_outside_bootstrapping
0x0026e1e0 str.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0x0026e370 str.linux
0x0026e384 str.btcd
0x0026e3d0 str.linux
0x0026e3e4 str.btcctl
0x0026e430 str.linux
0x0026e444 str.btcwallet
0x0026e4b8 str.btcctl.conf
0x0026e53c str.rpc.cert
0x0026e5c0 str.rpc.cert
HEAD
0x270767 4 4 main
0x27076f 4 4 sort
0x270777 4 4 sync
0x27077f 4 4 time
0x270786 4 4 *int
0x27078d 4 4 AAAA
0x270794 4 4 Add2
0x27079b 4 4 Addr
0x2707a2 4 4 Args
0x2707a9 4 4 Atim
TAIL
0x306b9a 5 5 %s+%s
0x31abbf 63 63 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-
0x306a26 5 5 btcdc
0x306a26 4 4 btcd
0x30708d 5 5 btcct
0x30708d 6 6 btcctl
0x308060 5 5 btcwa
0x308060 9 9 btcwallet
0x308f22 11 11 btcctl.conf
0x307bd6 8 8 rpc.cert
14368
EOF
RUN
+3
View File
@@ -9,6 +9,8 @@ EOF
EXPECT=<<EOF
amd64
amd64syscall
golang
golang_abi0
ms
reg
swift
@@ -73,6 +75,7 @@ afcl
EOF
EXPECT=<<EOF
arm64
golang
reg
swift
EOF
+4
View File
@@ -92,6 +92,8 @@ EOF
EXPECT=<<EOF
amd64
amd64syscall
golang
golang_abi0
ms
reg
swift
@@ -99,6 +101,8 @@ r0 reg(r0, r1, r2, r3)
rdi reg(rdi, rsi, rdx, rcx, r8, r9, r10, r11)
amd64
amd64syscall
golang
golang_abi0
ms
reg
swift
+22
View File
@@ -44,6 +44,22 @@ cc.amd64syscall.arg4=r8
cc.amd64syscall.arg5=r9
cc.amd64syscall.maxargs=6
cc.amd64syscall.ret=rax
cc.golang.arg0=rax
cc.golang.arg1=rbx
cc.golang.arg2=rcx
cc.golang.arg3=rdi
cc.golang.arg4=rsi
cc.golang.arg5=r8
cc.golang.arg6=r9
cc.golang.arg7=r10
cc.golang.arg8=r11
cc.golang.argn=stack
cc.golang.maxargs=9
cc.golang.ret=rax
cc.golang.self=r14
cc.golang_abi0.argn=stack
cc.golang_abi0.maxargs=0
cc.golang_abi0.ret=rax
cc.ms.arg0=rcx
cc.ms.arg1=rdx
cc.ms.arg2=r8
@@ -77,6 +93,8 @@ cc.swift.maxargs=11
cc.swift.ret=rax
cc.swift.self=r13
default.cc=amd64
golang=cc
golang_abi0=cc
ms=cc
reg=cc
swift=cc
@@ -175,6 +193,9 @@ EXPECT=<<EOF
"cc.fastcall.argn=stack",
"cc.fastcall.maxargs=2",
"cc.fastcall.ret=eax",
"cc.golang.argn=stack",
"cc.golang.maxargs=0",
"cc.golang.ret=eax",
"cc.optlink.arg0=eax",
"cc.optlink.arg1=edx",
"cc.optlink.arg2=ecx",
@@ -204,6 +225,7 @@ EXPECT=<<EOF
"cdecl-thiscall-ms=cc",
"default.cc=cdecl",
"fastcall=cc",
"golang=cc",
"optlink=cc",
"pascal=cc",
"reg=cc",
+7 -1
View File
@@ -8,6 +8,8 @@ EOF
EXPECT=<<EOF
amd64
amd64syscall
golang
golang_abi0
ms
reg
swift
@@ -20,6 +22,8 @@ CMDS=tcc
EXPECT=<<EOF
amd64
amd64syscall
golang
golang_abi0
ms
reg
swift
@@ -33,9 +37,11 @@ tccj
tccl
EOF
EXPECT=<<EOF
[{"name":"amd64","ret":"rax","args":["rdi","rsi","rdx","rcx","r8","r9","xmm0","xmm1","xmm2","xmm3","xmm4"]},{"name":"amd64syscall","ret":"rax","args":["rdi","rsi","rdx","r10","r8","r9"]},{"name":"ms","ret":"rax","args":["rcx","rdx","r8","r9"]},{"name":"reg","ret":"rdi","args":["rdi","rsi","rdx","rcx","r8","r9","r10","r11"]},{"name":"swift","ret":"rax","args":["rdi","rsi","rdx","rcx","r8","r9","xmm0","xmm1","xmm2","xmm3","xmm4"],"self":"r13","error":"r12"}]
[{"name":"amd64","ret":"rax","args":["rdi","rsi","rdx","rcx","r8","r9","xmm0","xmm1","xmm2","xmm3","xmm4"]},{"name":"amd64syscall","ret":"rax","args":["rdi","rsi","rdx","r10","r8","r9"]},{"name":"golang","ret":"rax","args":["rax","rbx","rcx","rdi","rsi","r8","r9","r10","r11"],"self":"r14"},{"name":"golang_abi0","ret":"rax","args":[]},{"name":"ms","ret":"rax","args":["rcx","rdx","r8","r9"]},{"name":"reg","ret":"rdi","args":["rdi","rsi","rdx","rcx","r8","r9","r10","r11"]},{"name":"swift","ret":"rax","args":["rdi","rsi","rdx","rcx","r8","r9","xmm0","xmm1","xmm2","xmm3","xmm4"],"self":"r13","error":"r12"}]
rax amd64 (rdi, rsi, rdx, rcx, r8, r9, xmm0, xmm1, xmm2, xmm3, xmm4);
rax amd64syscall (rdi, rsi, rdx, r10, r8, r9);
rax r14.golang (rax, rbx, rcx, rdi, rsi, r8, r9, r10, r11, stack);
rax golang_abi0 (stack);
rax ms (rcx, rdx, r8, r9, stack);
rdi reg (rdi, rsi, rdx, rcx, r8, r9, r10, r11);
rax r13.swift (rdi, rsi, rdx, rcx, r8, r9, xmm0, xmm1, xmm2, xmm3, xmm4) r12;