std::cout/std::cerr 段错误
std::cout/std::cerr seg faults
#include <iostream>
#include <cstring>
#include <dlfcn.h>
#include <fcntl.h>
#include <X11/X.h>
#include <X11/Xlib.h>
void* Module = nullptr;
typedef int (*XNextEventPtr)(Display *display, XEvent *event_return);
XNextEventPtr XNextEventHook = nullptr;
extern "C" int XNextEvent(Display* display, XEvent* event_return)
{
if (event_return)
{
event_return->xany.send_event = false;
}
if (XNextEventHook)
{
return XNextEventHook(display, event_return);
}
return 0;
}
void __attribute__((constructor)) initialize() //DLLMain.
{
char Root[256] = {0};
strcat(Root, "/usr/lib");
#if defined(__x86_64__)
strcat(Root, "/x86_64-linux-gnu");
#else
strcat(Root, "/i386-linux-gnu");
#endif // defined
strcat(Root, "/libX11.so");
Module = dlopen(Root, RTLD_GLOBAL | RTLD_LAZY);
std::cout<<"Loaded"<<std::flush;
XNextEventHook = reinterpret_cast<XNextEventPtr>(dlsym(Module, "XNextEvent")); //some reason RTLD_NEXT didn't find it.
if (XNextEventHook)
{
std::cout<<"Found XNextEvent"<<std::flush;
}
}
void __attribute__((destructor)) deinitialize() //DLLMain.
{
if (Module)
{
dlclose(Module);
Module = nullptr;
}
}
然后我做:
LD_PRELOAD="~/Desktop/MyHook.so" /usr/lib64/firefox
它会崩溃。但是,如果我将 std::cout
和 std::cerr
替换为 printf
或 perror
,它会完美地工作!
std::cout
会导致应用程序崩溃吗?
当我使用用 C++ 编写的应用程序加载模块时,它似乎加载正常。但是,如果我用用 C 编写的应用程序加载模块,它就会崩溃。
想法?
But if I load the module with an application written in C, it crashes.
C 应用程序将没有代码来调用 C++ 库的初始化例程:std::cout
等流将未初始化。
请参阅常见问题解答 here,特别是:
• You must use your C++ compiler when compiling main()
(e.g., for static initialization)
#include <iostream>
#include <cstring>
#include <dlfcn.h>
#include <fcntl.h>
#include <X11/X.h>
#include <X11/Xlib.h>
void* Module = nullptr;
typedef int (*XNextEventPtr)(Display *display, XEvent *event_return);
XNextEventPtr XNextEventHook = nullptr;
extern "C" int XNextEvent(Display* display, XEvent* event_return)
{
if (event_return)
{
event_return->xany.send_event = false;
}
if (XNextEventHook)
{
return XNextEventHook(display, event_return);
}
return 0;
}
void __attribute__((constructor)) initialize() //DLLMain.
{
char Root[256] = {0};
strcat(Root, "/usr/lib");
#if defined(__x86_64__)
strcat(Root, "/x86_64-linux-gnu");
#else
strcat(Root, "/i386-linux-gnu");
#endif // defined
strcat(Root, "/libX11.so");
Module = dlopen(Root, RTLD_GLOBAL | RTLD_LAZY);
std::cout<<"Loaded"<<std::flush;
XNextEventHook = reinterpret_cast<XNextEventPtr>(dlsym(Module, "XNextEvent")); //some reason RTLD_NEXT didn't find it.
if (XNextEventHook)
{
std::cout<<"Found XNextEvent"<<std::flush;
}
}
void __attribute__((destructor)) deinitialize() //DLLMain.
{
if (Module)
{
dlclose(Module);
Module = nullptr;
}
}
然后我做:
LD_PRELOAD="~/Desktop/MyHook.so" /usr/lib64/firefox
它会崩溃。但是,如果我将 std::cout
和 std::cerr
替换为 printf
或 perror
,它会完美地工作!
std::cout
会导致应用程序崩溃吗?
当我使用用 C++ 编写的应用程序加载模块时,它似乎加载正常。但是,如果我用用 C 编写的应用程序加载模块,它就会崩溃。
想法?
But if I load the module with an application written in C, it crashes.
C 应用程序将没有代码来调用 C++ 库的初始化例程:std::cout
等流将未初始化。
请参阅常见问题解答 here,特别是:
• You must use your C++ compiler when compiling
main()
(e.g., for static initialization)