簡體   English   中英

std :: cout / std :: cerr seg錯誤

[英]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

它將崩潰。 但是,我用printfperror替換了std::coutstd::cerr ,它可以完美地工作!

std::cout是否會導致應用程序崩潰?

似乎當我使用用C ++編寫的應用程序加載模塊時,它加載正常。 但是,如果我使用用C編寫的應用程序加載模塊,則會崩潰。

想法?

但是,如果我使用用C編寫的應用程序加載模塊,則會崩潰。

C應用程序將沒有代碼來調用C ++庫的初始化例程:諸如std::cout流將未初始化。

請參閱此處的常見問題解答,特別是:

•編譯main()時,必須使用C ++編譯器(例如,用於靜態初始化)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM