Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ndk -mthumb是否可以关闭 #927

Closed
compilelife opened this issue Aug 28, 2020 · 8 comments
Closed

ndk -mthumb是否可以关闭 #927

compilelife opened this issue Aug 28, 2020 · 8 comments

Comments

@compilelife
Copy link
Contributor

你在什么场景下需要该功能?

我们有一部分的库是用standalone编译的,默认情况下standalone是不加-mthumb的,这部分库目前不好修改编译选项。

另一部分库用xmake编译,但是默认xmake有加mthumb。

两种类型的库之间会互调用,传递stl相关对象(比如std::string),一种开thumb,一种不开thumb,这样可能会有运行时异常。

描述可能的解决方案

是否有什么选项我可以强制关闭thumb的?

描述你认为的候选方案

或者可以让我在xmake.lua里通过某种方式覆盖掉已经设置的-mthumb?

其他信息

查看了r14b的make_standalone_toolchain.py,是这么创建standalone的:

    if stl == 'gnustl':
        gnustl_dir = os.path.join(NDK_DIR, 'sources/cxx-stl/gnu-libstdc++/4.9')
        shutil.copytree(os.path.join(gnustl_dir, 'include'), cxx_headers)

        for abi in get_abis(arch):
            copy_gnustl_abi_headers(gnustl_dir, install_path, gcc_ver, triple,
                                    abi)
            copy_gnustl_libs(gnustl_dir, install_path, triple, abi)
            if arch == 'arm':
                copy_gnustl_abi_headers(gnustl_dir, install_path, gcc_ver,
                                        triple, abi, thumb=True)

也就是只在arch是arm时才会拷贝thumb的头文件。

@waruqi
Copy link
Member

waruqi commented Aug 29, 2020

这个不太好直接去 会影响现有的其他项目编译 具体如何去关 我得想想

@waruqi
Copy link
Member

waruqi commented Aug 29, 2020

也就是只在arch是arm时才会拷贝thumb的头文件。

xmake也就是arm下才会开 thumb

两种类型的库之间会互调用,传递stl相关对象(比如std::string),一种开thumb,一种不开thumb,这样可能会有运行时异常。

为啥会有问题?thumb / arm 之间的相互调用,不是可以自动切的么 blx 根据pc 地址是否为thumb 不是可以自动切指令模式的么?原本系统里面很多库 thumb arm存在混合调用的情况

对象的 mem 结构又不会受 指令集是否为thumb影响,指令变成2bytes,但是数据类型size还是没变,不像arm64,long啥的还会变成8bytes

@compilelife
Copy link
Contributor Author

xmake也就是arm下才会开 thumb

😂我意思是standalone只在armeabi时开启thumb

这个是xmake的ndk load.lua,32位的arm都开启了thumb(当然,这样并没啥问题。只是说和ndk不一致,导致我们这边出了问题)

    if arch and (arch == "armeabi" or arch == "armeabi-v7a" or arch == "armv5te" or arch == "armv7-a") then -- armv5te/armv7-a are deprecated
        arm32 = true
        toolchain:add("cxflags", "-mthumb")
        toolchain:add("asflags", "-mthumb")
        toolchain:add("ldflags", "-mthumb")
        toolchain:add("shflags", "-mthumb")
    end

为啥会有问题?

目前还不是很确定。主要信息来源有两个:

一个是在阿里的一个同事有介绍到;

另一个是从NDK的standlone里推断出来的:

某些版本的NDK里是否开启thumb对应的stl库是不一样的,比如11c:

./sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_shared.so
./sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/thumb/libgnustl_shared.so

在不确定的情况下,加上NDK stl在低版本一贯各种BUG的情况下,保证两个库使用相同/接近的编译参数是最稳妥的做法。

@waruqi
Copy link
Member

waruqi commented Aug 29, 2020

这个是xmake的ndk load.lua,32位的arm都开启了thumb(当然,这样并没啥问题。只是说和ndk不一致,导致我们这边出了问题)

那就多了个armeabi-v7a ,我看现在的新版ndk默认也都是开了thumb的

其他armv5te啥的都是些很老的ndk才有了 我都想废弃了

目前还不是很确定。主要信息来源有两个

只是ndk分了thumb库而已,据我所以arm和thumb的混合调用是没啥问题的,只要不是arm/arm64的混合用

当然选择性禁用 保证完全一致 也是合理的,不过这块具体怎么弄成可配置 我还得想想

我看现有高版本ndk都是默认开了thumb了 所以之前内置了

@compilelife
Copy link
Contributor Author

好的,我先混用着。等你的好消息。

@waruqi
Copy link
Member

waruqi commented Aug 30, 2020

我支持了,你更新下dev版本,xmake update -s dev

然后通过 set_values("ndk.arm_mode", "arm") 就可以开启 -marm 模式,默认是 -mthumb 模式

target("test")
    set_kind("shared")
    add_files("src/*.cpp")
    set_values("ndk.arm_mode", "arm")

@compilelife
Copy link
Contributor Author

👍有效

@waruqi
Copy link
Member

waruqi commented Oct 6, 2020

我在dev分支上做了进一步的改进,调整了工具链中内置的一些flags顺序,现在用户在 xmake.lua 中的 add_cxflags("-marm") 等配置,都可以覆盖内置的工具链flags。

-mthumb -marm 前一个是工具链的flags,后一个是user flags,这两个flags有冲突的情况下,最后面的flag会覆盖之前的flag设置,因此最终生效的将会是 -marm

当然如果用 flags 之间没有冲突关系,那么都会生效。

相关issue: #978

因此,之后用户只需要 add_cxflags /add_ldflags 简单的设置自己需要的flags就行了,如果跟内置的工具链中的flags冲突,那么优先会使用user flags

你也可以尝试下dev的这个特性,应该也能达到关闭-mthumb的效果

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants