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

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

 



Hi,

I am trying to see if moving mostly unused code (e.g. conditional
debug print statements) to a different section (and to different
pages) would impact performance in a large application.

Thanks,
Saul


On Wed, Feb 19, 2014 at 9:11 AM, Ian Lance Taylor <iant@xxxxxxxxxx> wrote:
> 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