> On 11 Mar 2025, at 12:04, Jonathan Wakely via Gcc-help <gcc-help@xxxxxxxxxxx> wrote: > > On Tue, 11 Mar 2025 at 09:01, David Brown via Gcc-help > <gcc-help@xxxxxxxxxxx> wrote: >> >> On 11/03/2025 07:26, manoj alladawar via Gcc-help wrote: >>> Dear GCC Community, >>> >>> I hope this message finds you well. >>> >>> I am currently working on a Debian-based system running Ubuntu 22.04 and >>> using GCC version 11.4.0. I have compiled a C source file using GCC with >>> the -O2 optimization flag, resulting in an optimized binary. >>> >>> I am now interested in generating high-level C code from this optimized >>> binary for analysis and understanding. Could you kindly advise me on which >>> decompiler would be most suitable for this purpose? Specifically, I would >>> appreciate recommendations for decompilers that perform effectively on >>> GCC-based optimized code. >>> >>> Your guidance and insights would be greatly appreciated. >>> >>> Thank you for your time and support. Kind regards, >>> Manoj Alladawar >>> >> >> I am not sure what you are trying to get at here. >> >> Suppose we have the function : >> >> int foo(int x) { >> int y = 0; >> for (int i = 0; i < 5; i++) { >> y += x; >> } >> return y; >> } >> >> When optimising, gcc will just multiply "x" by 5. >> >> Are you hoping to be able to run gcc on this, then decompile that output >> and get a result : >> >> int foo(int x) { >> return x * 5; >> } >> >> or even : >> >> int foo(int x) { >> return (x << 2) + x; >> } >> >> ? >> >> If so, I think no such tool is possible in the general case. >> >> There /are/ decompilers that turn assembly into compilable C. But the >> structure and details is often lost - an original "for" loop might end >> up as a "goto" loop, for example. Once you have fed in normal C code >> with optimisation, things like inter-procedural optimisations, constant >> propagation, inlining, and other re-arrangements will mean that the >> regurgitated C code is incomprehensible. It should be possible to >> compile it again and get the same semantics - that's the point of a >> decompiler. And it might be possible for security analysis tools to >> gather information about vulnerabilities. But it's not going to help >> you understand how the optimiser is working. >> >> I think the best tool for looking at optimisation of small sections of >> code is the <https://godbolt.org> online compiler explorer. You can put >> in C code (or many other languages) and look at the generated assembly - >> using an x86 compiler or any other target processor if you prefer. >> >> <https://godbolt.org/z/dG8dd57ej> > > I recently learnt of dogbolt.org for disassembling. Trying the example above on this site, BinaryNinja gives, as suggested: uint64_t foo(int32_t arg1) __pure { return arg1 * 5; }