这可能是我上一个问题中问题的根本原因: Remove exception/unwind functions from Android NDK shared objects。我将它提炼成一个最小的工作示例。
无论C / C ++版本如何,都会在C和C ++中发生。 (我以为C不应该有例外吗?)
带有异常处理函数的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;
}