如何检查在OpenOnload下运行的应用程序?

时间:2017-01-14 15:47:24

标签: c++ linux networking system openonload

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

如何做到这一点?

2 个答案:

答案 0 :(得分:2)

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

在这种情况下,您的应用程序环境将包含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;
}

答案 1 :(得分:0)

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

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