【问题标题】:How to check is application running under OpenOnload?如何检查应用程序是否在 OpenOnload 下运行?
【发布时间】:2017-01-14 15:47:24
【问题描述】:

我需要检查我的应用程序是否通过在 OpenOnload 下运行来加速。限制是不能使用特定于 Onload 的 API - 应用未与 Onload 扩展库链接。

如何做到这一点?

【问题讨论】:

    标签: c++ linux networking system openonload


    【解决方案1】:

    可以通过预加载的共享库存在libonload.so来检测OpenOnload。

    在这种情况下,您的应用程序环境将包含LD_PRELOAD=libonload.so 字符串。

    或者你可以枚举所有加载的共享库并检查libonload.so

    #include <string>
    #include <fstream>
    #include <iostream>
    
    // Checks is specific SO loaded in current process.
    bool is_so_loaded(const std::string& so_name)
    {
        const std::string proc_path = "/proc/self/maps";
        std::ifstream proc(proc_path);
    
        std::string str;
        while (std::getline(proc, str))
        {
            if (str.find(so_name) != std::string::npos) return true;
        }
    
        return false;
    }
    
    int main()
    {
        std::cout
            << "Running with OpenOnload: "
            << (is_so_loaded("/libonload.so") ? "Yes" : "No")
            << std::endl;
        return 0;
    }
    

    【讨论】:

    • 很好,但是如何枚举加载的 SO?
    【解决方案2】:

    只需使用默认的共享对象搜索顺序搜索符号“onload_is_present”,如果预加载了 onload,它将返回一个有效地址。

    bool IsOnloadPresent()
    {
       void* pIsOnloadPresent = dlsym(RTLD_DEFAULT, "onload_is_present");
       if(pIsOnloadPresent == NULL)
           return false;
       return true;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 2011-05-11
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多