如何查看OpenOnload下的应用程序运行?
How to check is application running under OpenOnload?
我需要检查我的应用程序是否在 OpenOnload 下被 运行 加速。限制是不能使用特定于 Onload 的 API - 应用程序未与 Onload 扩展库链接。
如何做到这一点?
OpenOnload 可以通过 pre-loaded 共享库存在 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;
}
只需使用默认的共享对象搜索顺序搜索符号“onload_is_present”,如果 onload 是 pre-loaded,它将 return 一个有效地址。
bool IsOnloadPresent()
{
void* pIsOnloadPresent = dlsym(RTLD_DEFAULT, "onload_is_present");
if(pIsOnloadPresent == NULL)
return false;
return true;
}
我需要检查我的应用程序是否在 OpenOnload 下被 运行 加速。限制是不能使用特定于 Onload 的 API - 应用程序未与 Onload 扩展库链接。
如何做到这一点?
OpenOnload 可以通过 pre-loaded 共享库存在 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;
}
只需使用默认的共享对象搜索顺序搜索符号“onload_is_present”,如果 onload 是 pre-loaded,它将 return 一个有效地址。
bool IsOnloadPresent()
{
void* pIsOnloadPresent = dlsym(RTLD_DEFAULT, "onload_is_present");
if(pIsOnloadPresent == NULL)
return false;
return true;
}