How to wrap existing function in C

后端 未结 2 1018
长情又很酷
长情又很酷 2020-12-19 08:20

I am trying to wrap existing function.

below code is perfectly worked.

#include

int __real_main();

int __wrap_main()
{
    printf(\         


        
2条回答
  •  温柔的废话
    2020-12-19 09:04

    The manpage for ld says:

       --wrap=symbol
           Use a wrapper function for symbol.  Any undefined reference to symbol will be resolved to "__wrap_symbol".  Any
           undefined reference to "__real_symbol" will be resolved to symbol.
    

    The keyword here is undefined.

    If you put the definition temp in the same translation unit as the code that uses it, it will not be undefined in the code that uses it.

    You need to split the code definition and the code that uses it:

    #!/bin/sh
    
    cat > user.c  <<'EOF'
    #include
    
    int temp(void);
    
    int __real_temp(void);
    
    int __wrap_temp()
    {
        printf("Wrapped temp\n");
        return __real_temp();
    }
    int main()
    {
        temp();
        return 0;
    }
    EOF
    
    cat > temp.c <<'EOF'
    #include
    int temp()
    {
        printf("temp\n");
        return 0;
    }
    EOF
    
    
    gcc user.c  -Wl,-wrap,temp temp.c  # OK
    ./a.out
    

    Splitting the build into two separate compiles perhaps makes it clearer:

    $ gcc -c user.c
    $ gcc -c temp.c
    $ nm user.o temp.o
    
    temp.o:
                     U puts
    0000000000000000 T temp
    
    user.o:
    0000000000000015 T main
                     U puts
                     U __real_temp
                     U temp
    0000000000000000 T __wrap_temp
    

    Now since temp is undefined in user.c, the linker can do its __real_/__wrap_magic on it.

    $ gcc  user.o temp.o  -Wl,-wrap=temp
    $ ./a.out
      Wrapped temp
      temp
    

提交回复
热议问题