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