GCC奇怪的是,它不应该生成异常处理代码

时间:2016-03-02 03:10:05

标签: android c++ c gcc android-ndk

这可能是我上一个问题中问题的根本原因: Remove exception/unwind functions from Android NDK shared objects。我将它提炼成一个最小的工作示例。

无论C / C ++版本如何,都会在C和C ++中发生。 (我以为C不应该有例外吗?)

Image of results

带有异常处理函数的13472字节共享对象:

int buf[1];

__attribute__((optimize("-Os"))) void bar() {
    buf[0] = 0;
}

__attribute__((visibility("default"))) void foo() {
    bar();
}

5180字节的共享对象,无异常处理:

int buf[1];

void bar() {
    buf[0] = 0;
}

__attribute__((visibility("default"))) void foo() {
    bar();
}

编译器标志:

LOCAL_C_INCLUDES := 

LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) -O3 -flto -Wall -D__ANDROID__ -fvisibility=hidden -s
LOCAL_CPPFLAGS := $(LOCAL_C_INCLUDES:%=-I%) -O3 -flto -Wall -D__ANDROID__ -fvisibility=hidden -s
LOCAL_CFLAGS += -pipe
LOCAL_CPPFLAGS += -pipe
LOCAL_CFLAGS += -fno-exceptions -fno-rtti # IGNORED
LOCAL_CPPFLAGS += -fno-exceptions -fno-rtti # IGNORED

__attribute__((optimize("-Os")))并没有用,但是为什么它会产生这种异常处理文件大小膨胀,我绝对不需要?

如何解决这个问题?

编辑:为了表明它不仅仅是用-O3进行优化,这也是5180字节,没有异常处理:

int buf[100];

void bar(int i, int j) {
    buf[i] = j;
}

__attribute__((visibility("default"))) void foo(int i, int j) {
    bar(i, j);
}

__attribute__((visibility("default"))) int getFoo(int i) {
    return buf[i];
}

__attribute__((visibility("default"))) int* getBuf() {
    return buf;
}

0 个答案:

没有答案