Xiaozhu, Would this handling of non-return functions be fixed by the patch that you sent to me for PPC?
-- John Mellor-Crummey (sent from my phone) > On Mar 15, 2018, at 8:02 AM, Thomas Dullien <thomasdull...@google.com> wrote: > > Hey there, > > ok, rebuilding DynInst 9.3.2 now to investigate why adding the string does > not seem to have any effect. > I looked at the source code, and I *think* the function is already in the > list of non-returning functions. > > Checking what is going on. Example setup: > > .plt.got:0000000000053CF8 __stack_chk_fail proc near ; CODE > XREF: init:loc_54673↓p > .plt.got:0000000000053CF8 ; > uninit:loc_54705↓p ... > .plt.got:0000000000053CF8 jmp cs:__stack_chk_fail_ptr > .plt.got:0000000000053CF8 __stack_chk_fail endp > > .text:00000000000A4290 var_8 = qword ptr -8 > .text:00000000000A4290 > .text:00000000000A4290 graph = rdi ; > AVFilterGraph_0 * > .text:00000000000A4290 flags = rsi ; unsigned int > .text:00000000000A4290 ; __unwind { > .text:00000000000A4290 push rax > .text:00000000000A4291 mov rax, fs:28h > .text:00000000000A429A mov [rsp+8+var_8], rax > .text:00000000000A429E mov [graph+5Ch], esi > .text:00000000000A42A1 mov rax, fs:28h > .text:00000000000A42AA cmp rax, [rsp+8+var_8] > .text:00000000000A42AE jnz short loc_A42B2 > .text:00000000000A42B0 pop rax > .text:00000000000A42B1 retn > .text:00000000000A42B2 ; > --------------------------------------------------------------------------- > .text:00000000000A42B2 > .text:00000000000A42B2 loc_A42B2: ; CODE XREF: > avfilter_graph_set_auto_convert+1E↑j > .text:00000000000A42B2 call __stack_chk_fail > .text:00000000000A42B2 ; } // starts at A4290 > .text:00000000000A42B2 avfilter_graph_set_auto_convert endp > > DynInst for some reason does not interpret the tailing call as non-return. > Digging to see what is going on, > will update here as I learn more :) > > Cheers, > Thomas > > >> On Thu, Mar 15, 2018 at 1:58 PM, Xiaozhu Meng <mxz...@gmail.com> wrote: >> Hi Thomas, >> >>> On Thu, Mar 15, 2018 at 4:06 AM, Thomas Dullien <thomasdull...@google.com> >>> wrote: >>> Hey there, >>> >>> ok, I have looked at a few options on how to best tackle this, and would >>> love to solicit advice :-) >>> >>> - I tried SymtabCodeSource::addNonReturning("__stack_chk_fail"); this did >>> not seem to have an effect. >> >> If you call SymtabCodeSource::addNonReturning("__stack_chk_fail") before >> calling CodeObject::parse(), this should work. >> >>> - Looked at set_retstatus -- but that implies that the code is already >>> parsed? >> >> You are right that after CodeObject::parse() has finished, calling >> set_retstatus will only change the flag of return status for this function, >> will not re-parse the binary. So, we can focus on why >> SymtabCodeSource::addNonReturning("__stack_chk_fail") does not work. >> >> >> >>> >>> Cheers, >>> Thomas >>> >>> >>>> On Thu, Mar 15, 2018 at 9:28 AM, Thomas Dullien <thomasdull...@google.com> >>>> wrote: >>>> Ah. No. I just fund set_retstatus :-) -- please ignore my question :-) >>>> >>>>> On Thu, Mar 15, 2018 at 9:26 AM, Thomas Dullien >>>>> <thomasdull...@google.com> wrote: >>>>> Hey there, >>>>> >>>>> after having my coffee, I realized: The proper way to do this is to >>>>> derive from CodeSource >>>>> and overload the nonReturning functions, I guess? :) >>>>> >>>>> Cheers, >>>>> Thomas >>>>> >>>>>> On Thu, Mar 15, 2018 at 9:14 AM, Thomas Dullien >>>>>> <thomasdull...@google.com> wrote: >>>>>> Hey there, >>>>>> >>>>>> I am running into troubles with disassembling executables generated by >>>>>> clang.3.8.1-24, for x64, with optimization set to size-optimize and >>>>>> stack cookies >>>>>> enabled. >>>>>> >>>>>> The trouble is that any function with an enabled stack cookie will end >>>>>> with a sequence >>>>>> of: >>>>>> >>>>>> Epilogue to check stack cookie >>>>>> jnz .fail >>>>>> Rest of epilogue. >>>>>> retn >>>>>> .fail: >>>>>> call __stack_checkfail // Does not return >>>>>> >>>>>> This leads to DynInst lumping all consecutive functions that use stack >>>>>> cookies >>>>>> into one huge CFG. >>>>>> >>>>>> Is there a way to tell DynInst that a particular function is not >>>>>> returning? I found >>>>>> that the parseAPI allows me to query if a function returns, but I did >>>>>> not find anything >>>>>> to "override" this behavior? >>>>>> >>>>>> Cheers, >>>>>> Thomas >>>>> >>>> >>> >>> >>> _______________________________________________ >>> Dyninst-api mailing list >>> Dyninst-api@cs.wisc.edu >>> https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api >> > > _______________________________________________ > Dyninst-api mailing list > Dyninst-api@cs.wisc.edu > https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api
_______________________________________________ Dyninst-api mailing list Dyninst-api@cs.wisc.edu https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api