Moving C++ code to a different ELF section

Ian Lance Taylor iant@google.com
Wed Feb 19 17:01:00 GMT 2014


On Wed, Feb 19, 2014 at 7:15 AM, Saul Tamari <stamari@gmail.com> wrote:
>
> 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.

So, you want -freorder-blocks-and-partition.

You can't do it using asm statements that change the section in ways
that the compiler doesn't know about.

Ian


> On Wed, Feb 19, 2014 at 9:11 AM, Ian Lance Taylor <iant@google.com> wrote:
>> On Wed, Feb 19, 2014 at 5:57 AM, Saul Tamari <stamari@gmail.com> 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



More information about the Gcc-help mailing list