Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Mock/Intercept/Hook Function in C++

  1. #1
    Ngày gia nhập
    08 2015
    Bài viết
    2

    Smile Mock/Intercept/Hook Function in C++

    Hi mọi người ạ,

    Em đang gặp 1 trường hợp khá khó như này, hiện tại không tìm được các giải quyết, nhờ mọi người chỉ bảo với ạ.

    Example: libF.cpp
    Code:
    class F
    {
       public:
        int Func1();
        int Func2();
    }
    
    int F:Func1()
    {
       //stuff
       printf("func1\n");
       return 0;
    };
    
    int F:Func2()
    {
       //stuff
       printf("func2\n");
       return Func1();
    }
    Em muốn thay đổi Func1() để khi call Func2() sẽ in ra dòng khác hoặc return khác 0.
    Example:
    Func1 -> Func1_wrap()
    Code:
    int Func1_wrap()
    {
       printf("func1_wap\n");
       return -1;
    };
    Em tìm được link refer: https://stackoverflow.com/questions/13961774/gnu-gcc-ld-wrapping-a-call-to-symbol-with-caller-and-callee-defined-in-the-sam
    nhưng chỉ áp dụng được cho C thôi vì khi build ra file object tên của function ở trong C++ được thêm các tiền tố khác.

    Có ai đã gặp trường hợp tương tự hoặc biết cách giải quyết chỉ em với ạ. Em cảm ơn

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    463

    đây nè: https://stackoverflow.com/questions/...function-calls

    đành phải bóc Func1() ra 1 file riêng... mà làm vậy khác gì khi link đừng link f1.o mà link f1_wrap.o thẳng luôn cho rồi ~.~

    f.h
    C++ Code:
    1. #pragma once
    2.  
    3. class F
    4. {
    5. public:
    6.     int Func1();
    7.     int Func2();
    8. };

    f1.cpp <-- tách hàm Func1 ra riêng
    C++ Code:
    1. #include "f.h"
    2. #include <cstdio>
    3.  
    4. int F::Func1() {
    5.   // stuff
    6.   printf("func1\n");
    7.   return 0;
    8. }

    f2.cpp
    C++ Code:
    1. #include "f.h"
    2. #include <cstdio>
    3.  
    4. int F::Func2() {
    5.   // stuff
    6.   printf("func2\n");
    7.   return Func1();
    8. }

    compile f1.cpp và f2.cpp:
    Code:
    g++ -c f1.cpp -o f1.o
    g++ -c f2.cpp -o f2.o
    dùng objdump xem symbol table của f1.o để biết F::Func1() được đặt tên là gì:
    Code:
    objdump -t f1.o
    ví dụ hiện ra
    Code:
    f1.o:     file format pe-x86-64
    
    SYMBOL TABLE:
    [  0](sec -2)(fl 0x00)(ty   0)(scl 103) (nx 1) 0x0000000000000000 f1.cpp
    File
    [  2](sec  4)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x0000000000000000 .text$_Z6printfPKcz
    AUX scnlen 0x54 nreloc 2 nlnno 0 checksum 0x0 assoc 0 comdat 2
    [  4](sec  4)(fl 0x00)(ty  20)(scl   2) (nx 1) 0x0000000000000000 _Z6printfPKcz
    AUX tagndx 0 ttlsiz 0x0 lnnos 0 next 0
    [  6](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x0000000000000000 _ZN1F5Func1Ev
    ...
    thì thấy ở đây F::Func1() có tên là _ZN1F5Func1Ev

    vậy ta viết file f1_wrap.cpp như sau: đặt tên hàm là "__wrap__" + "ZN1F5Func1Ev"

    f1_wrap.cpp
    C++ Code:
    1. //#include "f.h" //ko cần include f.h ở đây
    2. #include <cstdio>
    3.  
    4. extern "C" { //extern C để compile đúng tên hàm ko thêm name mangling gì hết
    5. int __wrap__ZN1F5Func1Ev() {
    6.   // stuff
    7.   printf("func1_wrap\n");
    8.   return 0;
    9. }
    10. }
    compile nó bình thường:
    Code:
    g++ -c f1_wrap.cpp -o f1_wrap.o
    link các object file thành file mock:
    Code:
    g++ -Wl,-wrap,_ZN1F5Func1Ev f1.o f2.o f1_wrap.o main.o -o mock
    chạy ra:
    Code:
    func2
    func1_wrap
    Đã được chỉnh sửa lần cuối bởi INTP : 05-08-2019 lúc 01:01 AM.

  3. #3
    Ngày gia nhập
    08 2015
    Bài viết
    2

    Khổ nỗi là em ko áp dụng cách tách được vì có rất nhiều hàm như thế. Hơi căng.
    Cảm ơn bác ở trên nhé. Em đang tìm phương án khác mà thực sự khó.

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    2,907

    Trích dẫn Nguyên bản được gửi bởi kientit1993 Xem bài viết
    Khổ nỗi là em ko áp dụng cách tách được vì có rất nhiều hàm như thế. Hơi căng.
    Cảm ơn bác ở trên nhé. Em đang tìm phương án khác mà thực sự khó.
    Bao nhiêu là nhiều, rất nhiều là bao nhiêu?
    Hãy trình bày một project vừa đủ, ưu tiên diễn giải (comment) bằng tiếng Việt.

    đủ mức thuyết phục sẽ có người giúp bạn cái bạn muốn, đích bạn cần đến.

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn