(CommandList children: [ (FuncDef name: libkey body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:libkey) op: Equal rhs: {(DQ (lib_symbols_) ($ VSub_Number '$1'))} spids: [14] ) ] spids: [14] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:patterns) op: Equal rhs: {(Lit_Other '[') (.) (Lit_Other '+') (Lit_Comma ',') (/-) (Lit_Other ']')} spids: [21] ) ] spids: [21] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:replacement) op:Equal rhs:{(_)} spids:[30])] spids: [30] ) (WhileUntil keyword: <KW_While while> cond: [(Sentence child:(C {(Lit_Other ':')}) terminator:<Op_Semi ';'>)] body: (DoGroup children: [ (Case to_match: {(DQ (' ') (${ VSub_Name libkey) (' '))} arms: [ (case_arm pat_list: [{(Lit_Other '*') (${ VSub_Name patterns) (Lit_Other '*')}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:libkey) op: Equal rhs: { (DQ (BracedVarSub token: <VSub_Name libkey> suffix_op: (StringUnary op_id: VOp1_DPercent arg_word: {(${ VSub_Name patterns) ('*')} ) spids: [65 72] ) (${ VSub_Name replacement) (BracedVarSub token: <VSub_Name libkey> suffix_op: (StringUnary op_id: VOp1_Pound arg_word: {('*') (${ VSub_Name patterns)} ) spids: [76 83] ) ) } spids: [63] ) ] spids: [63] ) ] spids: [55 60 87 16777215] ) (case_arm pat_list: [{(Lit_Other '*')}] action: [(ControlFlow token:<ControlFlow_Break break>)] spids: [90 91 97 16777215] ) ] spids: [42 52 100] ) ] spids: [39 103] ) ) (ControlFlow token:<ControlFlow_Return return> arg_word:{(0)}) ] spids: [11] ) spids: [7 10] ) (FuncDef name: usage body: (BraceGroup children: [ (SimpleCommand words: [{(cat)}] redirects: [ (HereDoc op: <Redir_DLessDash '<<-'> fd: 16777215 here_begin: {(EOF)} here_end_span_id: 132 stdin_parts: [ ('usage: ') ($ VSub_Number '$0') (' [-Uv] [-L LD_LIBRARY_PATH] file\n') ( ' -L: Specify an alternative LD_LIBRARY_PATH for the library resolution.\n' ) (' -U: Skip looking for unresolved symbols.\n') (' -v: Show which library each symbol is resolved to.\n') ] ) ] ) (ControlFlow token:<ControlFlow_Exit exit> arg_word:{(0)}) ] spids: [117] ) spids: [113 116] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:ret) op:Equal rhs:{(0)} spids:[141])] spids: [141] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:CHECK_UNRESOLVED) op:Equal rhs:{(1)} spids:[144])] spids: [144] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:VERBOSE_RESOLVED) op:Equal rhs:{(0)} spids:[147])] spids: [147] ) (WhileUntil keyword: <KW_While while> cond: [(Sentence child:(C {(getopts)} {(DQ ('L:Uv'))} {(flag)}) terminator:<Op_Semi ';'>)] body: (DoGroup children: [ (Case to_match: {(DQ (${ VSub_Name flag))} arms: [ (case_arm pat_list: [{(L)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:LIB_PATH) op: Equal rhs: {(DQ (${ VSub_Name OPTARG))} spids: [178] ) ] spids: [178] ) ] spids: [175 176 185 16777215] ) (case_arm pat_list: [{(U)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CHECK_UNRESOLVED) op: Equal rhs: {(0)} spids: [191] ) ] spids: [191] ) ] spids: [188 189 194 16777215] ) (case_arm pat_list: [{(v)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:VERBOSE_RESOLVED) op: Equal rhs: {(1)} spids: [200] ) ] spids: [200] ) ] spids: [197 198 203 16777215] ) (case_arm pat_list: [{(Lit_Other '*')}] action: [(C {(usage)})] spids: [206 207 211 16777215] ) ] spids: [164 172 214] ) ] spids: [161 216] ) ) (C {(shift)} { (ArithSubPart anode: (ArithBinary op_id: Arith_Minus left: (ArithVarRef name:OPTIND) right: (ArithWord w:{(Lit_Digits 1)}) ) spids: [220 225] ) } ) (If arms: [ (if_arm cond: [ (Sentence child: (Pipeline children: [(C {(Lit_Other '[')} {(-f)} {(DQ ($ VSub_Number '$1'))} {(Lit_Other ']')})] negated: T ) terminator: <Op_Semi ';'> ) ] action: [ (SimpleCommand words: [{(echo)} {(DQ ('No such file or directory: ') ($ VSub_Number '$1'))}] redirects: [(Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})] ) (ControlFlow token:<ControlFlow_Exit exit> arg_word:{(1)}) ] spids: [16777215 243] ) ] spids: [16777215 261] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:mime) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [(C {(file)} {(-L)} {(--mime-type)} {($ VSub_Number '$1')})] ) left_token: <Left_CommandSub '$('> spids: [265 273] ) } spids: [264] ) ] spids: [264] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:isbin) op:Equal rhs:{(0)} spids:[275])] spids: [275] ) (Case to_match: {($ VSub_Name '$mime')} arms: [ (case_arm pat_list: [{(Lit_Other '*') (application/x-executable)}] action: [ (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:isbin) op:Equal rhs:{(1)} spids:[288])] spids: [288] ) ] spids: [284 286 291 16777215] ) (case_arm pat_list: [{(Lit_Other '*') (application/x-sharedlib)}] spids: [293 295 296 16777215] ) (case_arm pat_list: [{(Lit_Other '*')}] action: [ (Sentence child: (SimpleCommand words: [{(echo)} {(DQ ('Not an elf file'))}] redirects: [(Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})] ) terminator: <Op_Semi ';'> ) (ControlFlow token:<ControlFlow_Exit exit> arg_word:{(1)}) ] spids: [298 299 315 16777215] ) ] spids: [278 282 317] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:unresolved_symbols) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {(nm)} {(-u)} {(-D)} {(--format) (Lit_Other '=') (posix)} {(DQ ($ VSub_Number '$1'))} ) (C {(awk)} {(SQ <'$2 == "U" {print $1}'>)}) (C {(tr)} {(SQ <'\\n'>)} {(SQ <' '>)}) ] negated: F ) ] ) left_token: <Left_CommandSub '$('> spids: [324 358] ) } spids: [323] ) ] spids: [323] ) (AndOr ops: [Op_DAmp] children: [ (C {(Lit_Other '[')} {(${ VSub_Name isbin)} {(-eq)} {(1)} {(Lit_Other ']')}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:bss_symbols) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {(nm)} {(-D)} {(--format) (Lit_Other '=') (posix)} {(DQ ($ VSub_Number '$1'))} ) (C {(awk)} {(SQ <'$2 == "B" && $4 != "" {print $1}'>)}) (C {(tr)} {(SQ <'\\n'>)} {(SQ <' '>)}) ] negated: F ) ] ) left_token: <Left_CommandSub '$('> spids: [375 407] ) } spids: [374] ) ] spids: [374] ) ] ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other '[')} {(-n)} {(DQ (${ VSub_Name LIB_PATH))} {(Lit_Other ']')}) terminator: <Op_Semi ';'> ) ] action: [ (ForEach iter_name: libc iter_words: [{(/lib/libc.so.) (Lit_Other '*')}] do_arg_iter: F body: (DoGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:LDD_ENV) op: Equal rhs: {(DQ ('LD_PRELOAD=') (${ VSub_Name libc))} spids: [440] ) ] spids: [440] ) ] spids: [437 449] ) spids: [432 435] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:LDD_ENV) op: Equal rhs: {(DQ (${ VSub_Name LDD_ENV) (' LD_LIBRARY_PATH=') (${ VSub_Name LIB_PATH))} spids: [452] ) ] spids: [452] ) ] spids: [16777215 424] ) ] spids: [16777215 463] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:ldd_libs) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {(env)} {(${ VSub_Name LDD_ENV)} {(ldd)} { (CommandSubPart command_list: (CommandList children: [(C {(realpath)} {($ VSub_Number '$1')})] ) left_token: <Left_CommandSub '$('> spids: [476 480] ) } ) (C {(awk)} {(SQ <'{print $1 ":" $3}'>)}) ] negated: F ) ] ) left_token: <Left_CommandSub '$('> spids: [467 489] ) } spids: [466] ) ] spids: [466] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:list_libs) op:Equal rhs:{(EmptyPart)} spids:[495])] spids: [495] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:resolved_symbols) op: Equal rhs: {(EmptyPart)} spids: [497] ) ] spids: [497] ) (ForEach iter_name: lib iter_words: [ { (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {(readelf)} {(-d)} {($ VSub_Number '$1')}) (C {(awk)} { (SQ < '$2 ~ /\\(?NEEDED\\)?/ { sub(/\\[/,"",$NF); sub(/\\]/,"",$NF); print $NF }' > ) } ) ] negated: F ) ] ) left_token: <Left_CommandSub '$('> spids: [505 519] ) } ] do_arg_iter: F body: (DoGroup children: [ (C {(echo)} {(-n)} {(DQ ('checking if ') ($ VSub_Name '$lib') (' is needed: '))}) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other '[')} {(-n)} { (DQ (BracedVarSub token: <VSub_Name lib> suffix_op: (StringUnary op_id: VOp1_DPound arg_word: {(Lit_Slash /) ('*')} ) spids: [543 548] ) ) } {(Lit_Other ']')} ) terminator: <Op_Semi ';'> ) ] action: [ (ForEach iter_name: libpair iter_words: [{(${ VSub_Name ldd_libs)}] do_arg_iter: F body: (DoGroup children: [ (Case to_match: {(DQ (${ VSub_Name libpair))} arms: [ (case_arm pat_list: [{(${ VSub_Name lib) (Lit_Other ':') (Lit_Other '*')}] action: [ (AndOr ops: [Op_DAmp] children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:libpath) op: Equal rhs: { (DQ (BracedVarSub token: <VSub_Name libpair> suffix_op: (StringUnary op_id: VOp1_Pound arg_word: {('*:')} ) spids: [591 595] ) ) } spids: [589] ) ] spids: [589] ) (ControlFlow token: <ControlFlow_Break break> ) ] ) ] spids: [582 587 602 16777215] ) ] spids: [571 579 605] ) ] spids: [568 608] ) spids: [562 566] ) ] spids: [16777215 554] ) ] else_action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:libpath) op: Equal rhs: {(DQ (${ VSub_Name lib))} spids: [614] ) ] spids: [614] ) ] spids: [611 622] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:list_libs) op: Equal rhs: {(DQ ($ VSub_Name '$list_libs') (' ') ($ VSub_Name '$lib'))} spids: [625] ) ] spids: [625] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:foundone) op: Equal rhs: {(EmptyPart)} spids: [633] ) ] spids: [633] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:lib_symbols) op: Equal rhs: { (DQ (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {(nm)} {(-D)} {(--defined-only)} {(--format) (Lit_Other '=') (posix)} {(DQ (${ VSub_Name libpath))} ) (C {(awk)} {(SQ <'$2 ~ /C|R|D|T|W|B|V/ {print $1}'>)}) (C {(tr)} {(SQ <'\\n'>)} {(SQ <' '>)}) ] negated: F ) ] ) left_token: <Left_CommandSub '$('> spids: [638 674] ) ) } spids: [636] ) ] spids: [636] ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other '[')} {(${ VSub_Name CHECK_UNRESOLVED)} {(-eq)} {(1)} {(Lit_Other ']')} ) terminator: <Op_Semi ';'> ) ] action: [ (C {(libkey)} {(DQ (${ VSub_Name lib))}) (C {(setvar)} {(DQ (${ VSub_Name libkey))} {(DQ (${ VSub_Name lib_symbols))}) ] spids: [16777215 693] ) ] spids: [16777215 724] ) (ForEach iter_name: fct iter_words: [{(${ VSub_Name lib_symbols)}] do_arg_iter: F body: (DoGroup children: [ (Case to_match: { (DQ (' ') (${ VSub_Name unresolved_symbols) (' ') (${ VSub_Name bss_symbols) (' ') ) } arms: [ (case_arm pat_list: [ {(Lit_Other '*') (EscapedLiteralPart token:<Lit_EscapedChar '\\ '>) (${ VSub_Name fct) (EscapedLiteralPart token:<Lit_EscapedChar '\\ '>) (Lit_Other '*') } ] action: [ (AndOr ops: [Op_DAmp] children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:foundone) op: Equal rhs: {(DQ (${ VSub_Name fct))} spids: [767] ) ] spids: [767] ) (ControlFlow token: <ControlFlow_Break break> ) ] ) ] spids: [758 765 778 16777215] ) ] spids: [741 755 781] ) ] spids: [738 784] ) spids: [732 736] ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other '[')} {(-n)} {(DQ (${ VSub_Name foundone))} {(Lit_Other ']')}) terminator: <Op_Semi ';'> ) ] action: [(C {(echo)} {(DQ ('yes... ') (${ VSub_Name foundone))})] spids: [16777215 802] ) ] else_action: [ (C {(echo)} {(DQ (no))}) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:ret) op:Equal rhs:{(1)} spids:[825])] spids: [825] ) ] spids: [815 829] ) ] spids: [522 831] ) spids: [504 520] ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other '[')} {(${ VSub_Name CHECK_UNRESOLVED)} {(-eq)} {(1)} {(Lit_Other ']')}) terminator: <Op_Semi ';'> ) ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:list_libs) op: Equal rhs: {(DQ (${ VSub_Name list_libs) (' crt1.o'))} spids: [856] ) ] spids: [856] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:lib_symbols) op: Equal rhs: { (DQ (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {(nm)} {(--defined-only)} {(--format) (Lit_Other '=') (posix)} {(DQ (/usr/lib/crt1.o))} ) (C {(awk)} {(SQ <'$2 ~ /C|R|D|T|W|B|V/ {print $1}'>)}) (C {(tr)} {(SQ <'\\n'>)} {(SQ <' '>)}) ] negated: F ) ] ) left_token: <Left_CommandSub '$('> spids: [867 899] ) ) } spids: [865] ) ] spids: [865] ) (C {(libkey)} {(DQ (crt1.o))}) (C {(setvar)} {(DQ (${ VSub_Name libkey))} {(DQ (${ VSub_Name lib_symbols))}) (ForEach iter_name: sym iter_words: [{(${ VSub_Name unresolved_symbols)}] do_arg_iter: F body: (DoGroup children: [ (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:found) op:Equal rhs:{(0)} spids:[948])] spids: [948] ) (ForEach iter_name: lib iter_words: [{(${ VSub_Name list_libs)}] do_arg_iter: F body: (DoGroup children: [ (C {(libkey)} {(DQ (${ VSub_Name lib))}) (C {(eval)} { (DQ ('lib_symbols=') (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (EscapedLiteralPart token: <Lit_EscapedChar '\\$'> ) ('{') (${ VSub_Name libkey) ('}') (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) ) } ) (Case to_match: {(DQ (' ') (${ VSub_Name lib_symbols) (' '))} arms: [ (case_arm pat_list: [ {(Lit_Other '*') (EscapedLiteralPart token: <Lit_EscapedChar '\\ '> ) (${ VSub_Name sym) (EscapedLiteralPart token:<Lit_EscapedChar '\\ '>) (Lit_Other '*') } ] action: [ (AndOr ops: [Op_DAmp] children: [ (C {(Lit_Other '[')} {(${ VSub_Name VERBOSE_RESOLVED)} {(-eq)} {(1)} {(Lit_Other ']')} ) (C {(echo)} { (DQ ('Resolved symbol ') (${ VSub_Name sym) (' from ') (${ VSub_Name lib) ) } ) ] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:found) op: Equal rhs: {(1)} spids: [1046] ) ] spids: [1046] ) (ControlFlow token: <ControlFlow_Break break> ) ] spids: [1007 1014 1053 16777215] ) ] spids: [994 1004 1056] ) ] spids: [963 1059] ) spids: [957 961] ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other '[')} {($ VSub_Name '$found')} {(-eq)} {(0)} {(Lit_Other ']')} ) terminator: <Op_Semi ';'> ) ] action: [ (C {(echo)} {(DQ ('Unresolved symbol ') ($ VSub_Name '$sym'))}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:ret) op: Equal rhs: {(1)} spids: [1086] ) ] spids: [1086] ) ] spids: [16777215 1075] ) ] spids: [16777215 1090] ) ] spids: [945 1093] ) spids: [939 943] ) ] spids: [16777215 849] ) ] spids: [16777215 1095] ) (ControlFlow token:<ControlFlow_Exit exit> arg_word:{(${ VSub_Name ret)}) ] )