Как я могу остановить g ++ от соединения нежелательного кода обработки исключений?

В соответствии с инструкциями Сэма я разработал простое приложение, показывающее прокрутку двух списков вместе. На самом деле моей главной целью является создание горизонтально прокручиваемого расширяемого списка с фиксированными / замороженными столбцами, и работа над ним, когда он будет завершен, скоро предоставит к нему доступ https://github.com/huseyinDaVinci/Android/tree/master/FrozenListViews

5
задан Neil 15 June 2009 в 22:10
поделиться

3 ответа

Я думаю, что самое близкое, что вы можете получить, это компиляция и связывание с -fno-исключения и -fno-rtti. Если есть лучший способ избавиться от остального, я был бы рад услышать его сам.

Что касается избавления от новых, попробуйте -nostdlib.

5
ответ дан 13 December 2019 в 22:14
поделиться

, поскольку вы в основном делаете то, что разработчик ОС сделал бы, чтобы получить автономную среду c или c ++. Возможно, вы захотите изучить простой сценарий компоновщика. Вам просто нужно быть осторожным, потому что такие вещи, как глобальные конструкторы, больше не происходят автоматически .. но вы также не получите ничего, о чем не просили явно (и нетрудно написать код для вызова глобальных конструкторов). Вот сценарий компоновщика из моей ОС.

OUTPUT_FORMAT("elf32-i386")
ENTRY(start)

virt = 0xc0100000; /* 3.1 gig */
phys = 0x00100000; /* 1 meg */

SECTIONS
{ 
    .text virt : AT(phys) 
    {
        code = .; _code = .; __code = .;
        *(.text)
        *(.gnu.linkonce.t*)
        . = ALIGN(4096); 
    }

    .rodata : AT(phys + (rodata - code))
    {
        rodata = .; _rodata = .; __rodata = .;
        *(.rodata*)
        *(.gnu.linkonce.r*)
        __CTOR_LIST__ = .;
        LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) 
        *(.ctors) 
        LONG(0) 
        __CTOR_END__ = .; 

        __DTOR_LIST__ = .; 
        LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) 
        *(.dtors) 
        LONG(0) 
        __DTOR_END__ = .; 
        . = ALIGN(4096); 
    }

    .data : AT(phys + (data - code))
    {
        data = .; _data = .; __data = .;    
        *(.data)
        *(.gnu.linkonce.d*)
        . = ALIGN(4096); 
    }

    .tbss : AT(phys + (tbss - code)) 
    {
        tbss = .; _tbss = .; __tbss = .;
        *(.tbss)
        *(.tbss.*)
        . = ALIGN(4096); 
    }

    .bss : AT(phys + (bss - code)) 
    {
        bss = .; _bss = .; __bss = .;
        *(.bss)
        *(.bss.*)
        *(COMMON)
        *(.gnu.linkonce.b*)
        . = ALIGN(4096); 
    }

    end = .; _end = .; __end = .;
}

Он, вероятно, делает больше, чем вам нужно (выравнивает разделы по границам 4k, имеет все символы на отметке> 3 ГБ), но является хорошей отправной точкой.

Вы можете использовать его следующим образом:

ld -T link_script.ld *.o -lc -o appname

"

5
ответ дан 13 December 2019 в 22:14
поделиться

Вы можете попробовать перехватить new, чтобы увидеть, действительно ли он вызывается.

New может происходить неявно при некоторых обстоятельствах, например, при построении копирования.

Вы можете сделать это удалите их, написав свой код немного иначе.

http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter11_013.html

0
ответ дан 13 December 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: