V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
formoslian
V2EX  ›  问与答

朋友们,有什么好办法测试程序在大端情况下能跑吗?

  •  
  •   formoslian · 79 天前 · 481 次点击
    这是一个创建于 79 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在的任务是有一个 c++ 库,想测一下大端机器下能不能 work 。
    因为是开源社区的活,所以是我自己在探索。
    为啥会有这个需求,我觉得是因为很多老的工厂机器还是 ppc 等大端机。

    我是可以接受租用服务器的,但是 powerpc 这种真的有服务器吗?
    在搜索了很多外国帖子后,我转向 qemu ,现在卡在网络配置不通这边,这部分实在是太折磨我了。
    7 条回复    2023-01-10 17:26:04 +08:00
    pocarisweat
        1
    pocarisweat  
       79 天前
    建议还是 QEMU ,网络功能如果不是必需的话可以通过其他办法迂回解决,比如挂载数据到 iso 里。

    如果要真机测的话,可以试试 Travis CI ,它们提供了 arm/ppc/z 的环境,但 ppc 似乎只有 ppc64le ,只有 z 是大端。而且好像要求是 GitHub 上的公开仓库。

    https://linuxone.cloud.marist.edu/ 也许也可以申请一个临时的大端机环境。

    https://godbolt.org/ 这个网站也可以试一下,看看有没有运行的选项。

    或者方便的话(看到你说是开源库),可以提供点更多信息,也许我可以帮你测一下。
    formoslian
        2
    formoslian  
    OP
       78 天前
    太感谢了!昨晚发完帖子我就睡觉了,不好意思,没看到!

    我先试试,如果太头疼就麻烦你帮我测试 hhhh
    是 llvm/ libcxx 的一个库,那个分支拉代码下来大概 800M ,挂载 iso 总感觉不对劲 hhh

    godbolt.org 的实现是交叉编译 https://github.com/compiler-explorer/infra/pull/127
    我有点没说清楚,因为还有个类似 gtest 的测试框架需要来运行正确性。

    我去试试 travis CI 👍
    formoslian
        3
    formoslian  
    OP
       78 天前
    @pocarisweat 第一次发帖,不是很熟悉回复功能,补一个 艾特
    pocarisweat
        4
    pocarisweat  
       78 天前
    @formoslian
    是 32 位 Linux 上的老 PPC ?总之 libc++应该不会在大端下出问题,它对许多大端平台支持挺好的
    formoslian
        5
    formoslian  
    OP
       78 天前
    @pocarisweat 不是的,其实只要测试下大端就行

    我们社区自己开发了一个库,提了个大 patch ,准备合入 libc++,但是没测过大端
    (hahaha ,如果不能跑大端,就毁了上面的名声)
    formoslian
        6
    formoslian  
    OP
       78 天前
    docker 模拟 qemu ,目前看起来工作的挺顺利的
    https://docs.gitlab.com/omnibus/development/s390x.html
    我跑了一段 chatgpt 生成的代码

    ```
    [email protected]:~# g++ check_endian.cc -O2 -o is_big_endian\?
    [email protected]:~# ./is_big_endian\?
    Original Number: 258
    Bytes: 1 2
    System is Big Endian
    [email protected]:~# cat check_endian.cc
    #include <iostream>
    #include <cstring>

    int main() {
    short int num = 0x0102;
    char *num_ptr = (char*)&num;

    std::cout << "Original Number: " << num << std::endl;
    std::cout << "Bytes: ";
    for (int i = 0; i < sizeof(num); i++) {
    std::cout << (int)*(num_ptr + i) << " ";
    }
    std::cout << std::endl;

    if (*num_ptr == 0x01) {
    std::cout << "System is Big Endian" << std::endl;
    } else {
    std::cout << "System is Little Endian" << std::endl;
    }
    return 0;
    }
    [email protected]:~# lscpu | grep Endian
    Byte Order: Big Endian
    [email protected]:~#
    ```
    formoslian
        7
    formoslian  
    OP
       78 天前
    markdown 好像没起作用,补一个 godbolt 的 x86 小端(intel skylake) 结果

    https://godbolt.org/z/9c7dGf6ox
    关于   ·   帮助文档   ·   博客   ·   nftychat   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   993 人在线   最高记录 5556   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 20:05 · PVG 04:05 · LAX 13:05 · JFK 16:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.