Write position independent code. This is much easier nowadays that you can use RIP relative addressing. To include data, just append it to your code or even put it inline with jmps to avoid executing it. To accomplish tasks use syscalls. If you want a library, load it dynamically with dlsym.
Also take a look at https://en.wikipedia.org/wiki/Return-oriented_programming