GNU --wrap <symbol>
, .
--wrap write
, write
__wrap_write
( ), __real_write
write
( ).
write()
- , hello.o
:
$ cat hello.c
#include <unistd.h>
int main(void)
{
write(0, "Hello, world!\n", 14);
return 0;
}
$ gcc -Wall -c hello.c
$ gcc -o test1 hello.o
$ ./test1
Hello, world!
$
__wrap_write()
, __real_write()
. ( , , __real_write
. , - #define write __real_write
#include <unistd.h>
.)
$ cat wrapper.c
#include <unistd.h>
extern ssize_t __real_write(int fd, const void *buf, size_t n);
ssize_t __wrap_write(int fd, const void *buf, size_t n)
{
__real_write(fd, "[wrapped] ", 10);
return __real_write(fd, buf, n);
}
$ gcc -Wall -c wrapper.c
$
hello.o
, wrapper.o
, . ( gcc
, -Wl,option
.)
$ gcc -o test2 -Wl,--wrap -Wl,write hello.o wrapper.o
$ ./test2
[wrapped] Hello, world!
$