Re: Moving C++ code to a different ELF section

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Feb 19, 2014 at 5:57 AM, Saul Tamari <stamari@xxxxxxxxx> wrote:
>
> I'm trying to move some C++ code to a different ELF section and am
> facing some errors which I don't understand. I'm using g++ v4.8.1 on
> x86.
>
> When compiling the following code I'm getting these errors:
> /tmp/ccpp2AkE.s: Assembler messages:
> /tmp/ccpp2AkE.s:63: Error: CFI instruction used without previous .cfi_startproc
> /tmp/ccpp2AkE.s:64: Error: CFI instruction used without previous .cfi_startproc
> /tmp/ccpp2AkE.s:66: Error: .cfi_endproc without corresponding .cfi_startproc
> /tmp/ccpp2AkE.s: Error: open CFI at the end of file; missing
> .cfi_endproc directive
>
>
> The source is:
> #include <iostream>
> #include <stdlib.h>
>
> int qqq;
>
> int main(int argc, char* argv[])
> {
>         std::cout << "hey " << std::endl;
>
>         qqq = rand();
>         if (qqq > 0x1000000) {
>                 asm volatile ("jmp 1f \n\t  .pushsection
> __kuku,\"ax\",@progbits \n\t 1:");
>                 std::cout << "0x123456" << std::endl;
>                 throw 12345;
>                 asm volatile("jmp 3f \n\t .popsection  \n\t 3:");
>         }
>
>         return 0;
> }
>
>
> What do these errors mean? Is there a way to fix them? Is there an
> alternate method to move similar code to a different section?

The assembler errors occur because GCC emits debug info in the
assembler stream using CFI pseudo-ops, and you are moving the
pseudo-ops to a different section in a way that GCC does not
understand.  The assembler is seeing CFI pseudo-ops that make no
sense, so it is giving errors about them.

The approach you are using can not work.  The compiler is not an
assembler.  It does not issue instructions in precise sequence.  It
copies and duplicates and rearranges instructions as it sees fit.
This is so even though you are using asm volatile.  All the asm
volatile promises is that the string will appear at the right point in
execution sequence.  Your strings can only work if they appear at the
right point in the assembler output.  That is a different matter that
the compiler does not guarantee.

You didn't see what you are trying to do, but at a guess you should
look at the -freorder-blocks-and-partition option.

Ian




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux