Elfspy fork using the meson build system.
Go to file
2018-04-12 00:30:06 +02:00
examples added rpath 2018-03-17 09:05:02 +01:00
images cropped 2016-10-09 13:57:12 +02:00
.gitignore about time 2018-03-15 19:55:45 +01:00
Arg.h Initial version 2016-09-16 17:45:35 +02:00
Call.cpp Initial version 2016-09-16 17:45:35 +02:00
Call.h Initial version 2016-09-16 17:45:35 +02:00
Capture.h Initial version 2016-09-16 17:45:35 +02:00
ELFInfo.cpp cache debug directory scans 2018-03-16 23:39:49 +01:00
ELFInfo.h added support for separate debug file and cleaned up iteration syntax 2018-03-15 19:57:34 +01:00
ELFObject.h cleanup 2018-03-15 19:58:59 +01:00
Error.cpp Initial version 2016-09-16 17:45:35 +02:00
Error.h Initial version 2016-09-16 17:45:35 +02:00
Fail.cpp Initial version 2016-09-16 17:45:35 +02:00
Fail.h Initial version 2016-09-16 17:45:35 +02:00
Fake.h Initial version 2016-09-16 17:45:35 +02:00
Function.h Initial version 2016-09-16 17:45:35 +02:00
GOTEntry.cpp Change to handle libc-2.27 info for executable 2018-03-15 19:58:20 +01:00
GOTEntry.h Started testing virtual inheritance 2016-09-17 22:46:34 +02:00
Hook.h Started testing virtual inheritance 2016-09-17 22:46:34 +02:00
HookBase.h Initial version 2016-09-16 17:45:35 +02:00
HookImpl.h Initial version 2016-09-16 17:45:35 +02:00
Lambda.h Initial version 2016-09-16 17:45:35 +02:00
LICENSE Create LICENSE 2018-03-19 15:55:19 +01:00
makefile added file 2018-03-15 19:58:39 +01:00
makefile.inc Moved examples to separate dir 2016-10-09 15:37:55 +02:00
Method.h Initial version 2016-09-16 17:45:35 +02:00
MethodInfo.h Initial version 2016-09-16 17:45:35 +02:00
MethodPointer.h Initial version 2016-09-16 17:45:35 +02:00
MFile.cpp Minor change 2018-03-15 19:53:38 +01:00
MFile.h Initial version 2016-09-16 17:45:35 +02:00
Profiler.h Initial version 2016-09-16 17:45:35 +02:00
README README change 2016-09-30 18:32:32 +02:00
README.md Update README.md 2018-04-12 00:30:06 +02:00
Report.cpp Initial version 2016-09-16 17:45:35 +02:00
Report.h Initial version 2016-09-16 17:45:35 +02:00
Result.h Initial version 2016-09-16 17:45:35 +02:00
Section.h Support for better syntax 2018-03-15 19:56:25 +01:00
SectionHeader.cpp Support for better syntax 2018-03-15 19:56:25 +01:00
SectionHeader.h Support for better syntax 2018-03-15 19:56:25 +01:00
SPY.cpp Initial version 2016-09-16 17:45:35 +02:00
SPY.h Started testing virtual inheritance 2016-09-17 22:46:34 +02:00
Thunk.h Initial version 2016-09-16 17:45:35 +02:00
ThunkHandle.h Initial version 2016-09-16 17:45:35 +02:00
Variadic.h Initial version 2016-09-16 17:45:35 +02:00

ELFspy is a library for linux for writing tests using fakes and spies in C++. For very large call graphs, the testing of the higher nodes can be difficult due to the sum of dependencies of lower nodes e.g. databases, network connections etc. Adding fakes and spies to the callees of a function allows it to be tested in isolation without the inherited dependencies.

ELFspy works by allowing code to externally modify an existing implementation/library of a program. This is achieved by changing function addresses in the global offset tables of the running program, so that these are redirected to a different function created by ELFspy. This allows new functions to be interjected between the caller and the callee to spy on the arguments and return value. In addition the original function can be replaced with a simulation (fake) of the original. The code under test needs no changes and is unaware of the additional calls that are being made in between a caller and a callee.

Call graph before change

External code:

auto add_spy = SPY(&add);

Call graph after change(the code does not change, but the runtime execution does)

This technique relies on code being compiled as position independent code and uses the Executable and Linking Format(ELF) information found in the executable and its shared libraries to find the global offset table entries and modify them.

To see how ELFspy can be used start by reading this example