(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] ) (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_id: Redir_DLessDash fd: 16777215 body: { (DQ ('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') ) } do_expansion: True here_end: EOF was_filled: T spids: [122] ) ] ) (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:[140])] spids: [140] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:CHECK_UNRESOLVED) op:Equal rhs:{(1)} spids:[143])] spids: [143] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:VERBOSE_RESOLVED) op:Equal rhs:{(0)} spids:[146])] spids: [146] ) (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: [177] ) ] spids: [177] ) ] spids: [174 175 184 16777215] ) (case_arm pat_list: [{(U)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CHECK_UNRESOLVED) op: Equal rhs: {(0)} spids: [190] ) ] spids: [190] ) ] spids: [187 188 193 16777215] ) (case_arm pat_list: [{(v)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:VERBOSE_RESOLVED) op: Equal rhs: {(1)} spids: [199] ) ] spids: [199] ) ] spids: [196 197 202 16777215] ) (case_arm pat_list: [{(Lit_Other '*')}] action: [(C {(usage)})] spids: [205 206 210 16777215] ) ] spids: [163 171 213] ) ] spids: [160 215] ) ) (C {(shift)} { (ArithSubPart anode: (ArithBinary op_id: Arith_Minus left: (ArithVarRef name:OPTIND) right: (ArithWord w:{(Lit_Digits 1)}) ) spids: [219 224] ) } ) (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_id:Redir_GreatAnd fd:16777215 arg_word:{(2)} spids:[252])] ) (ControlFlow token:<ControlFlow_Exit exit> arg_word:{(1)}) ] spids: [16777215 242] ) ] spids: [16777215 260] ) (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: [264 272] ) } spids: [263] ) ] spids: [263] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:isbin) op:Equal rhs:{(0)} spids:[274])] spids: [274] ) (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:[287])] spids: [287] ) ] spids: [283 285 290 16777215] ) (case_arm pat_list: [{(Lit_Other '*') (application/x-sharedlib)}] spids: [292 294 295 16777215] ) (case_arm pat_list: [{(Lit_Other '*')}] action: [ (Sentence child: (SimpleCommand words: [{(echo)} {(DQ ('Not an elf file'))}] redirects: [(Redir op_id:Redir_GreatAnd fd:16777215 arg_word:{(2)} spids:[306])] ) terminator: <Op_Semi ';'> ) (ControlFlow token:<ControlFlow_Exit exit> arg_word:{(1)}) ] spids: [297 298 314 16777215] ) ] spids: [277 281 316] ) (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: [323 357] ) } spids: [322] ) ] spids: [322] ) (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: [374 406] ) } spids: [373] ) ] spids: [373] ) ] ) (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: [439] ) ] spids: [439] ) ] spids: [436 448] ) spids: [431 434] ) (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: [451] ) ] spids: [451] ) ] spids: [16777215 423] ) ] spids: [16777215 462] ) (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: [475 479] ) } ) (C {(awk)} {(SQ <'{print $1 ":" $3}'>)}) ] negated: F ) ] ) left_token: <Left_CommandSub '$('> spids: [466 488] ) } spids: [465] ) ] spids: [465] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:list_libs) op:Equal rhs:{(EmptyPart)} spids:[494])] spids: [494] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:resolved_symbols) op: Equal rhs: {(EmptyPart)} spids: [496] ) ] spids: [496] ) (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: [504 518] ) } ] 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: [542 547] ) ) } {(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: [590 594] ) ) } spids: [588] ) ] spids: [588] ) (ControlFlow token: <ControlFlow_Break break> ) ] ) ] spids: [581 586 601 16777215] ) ] spids: [570 578 604] ) ] spids: [567 607] ) spids: [561 565] ) ] spids: [16777215 553] ) ] else_action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:libpath) op: Equal rhs: {(DQ (${ VSub_Name lib))} spids: [613] ) ] spids: [613] ) ] spids: [610 621] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:list_libs) op: Equal rhs: {(DQ ($ VSub_Name '$list_libs') (' ') ($ VSub_Name '$lib'))} spids: [624] ) ] spids: [624] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:foundone) op: Equal rhs: {(EmptyPart)} spids: [632] ) ] spids: [632] ) (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: [637 673] ) ) } spids: [635] ) ] spids: [635] ) (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 692] ) ] spids: [16777215 723] ) (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: [766] ) ] spids: [766] ) (ControlFlow token: <ControlFlow_Break break> ) ] ) ] spids: [757 764 777 16777215] ) ] spids: [740 754 780] ) ] spids: [737 783] ) spids: [731 735] ) (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 801] ) ] else_action: [ (C {(echo)} {(DQ (no))}) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:ret) op:Equal rhs:{(1)} spids:[824])] spids: [824] ) ] spids: [814 828] ) ] spids: [521 830] ) spids: [503 519] ) (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: [855] ) ] spids: [855] ) (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: [866 898] ) ) } spids: [864] ) ] spids: [864] ) (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:[947])] spids: [947] ) (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: [1045] ) ] spids: [1045] ) (ControlFlow token: <ControlFlow_Break break> ) ] spids: [1006 1013 1052 16777215] ) ] spids: [993 1003 1055] ) ] spids: [962 1058] ) spids: [956 960] ) (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: [1085] ) ] spids: [1085] ) ] spids: [16777215 1074] ) ] spids: [16777215 1089] ) ] spids: [944 1092] ) spids: [938 942] ) ] spids: [16777215 848] ) ] spids: [16777215 1094] ) (ControlFlow token:<ControlFlow_Exit exit> arg_word:{(${ VSub_Name ret)}) ] )