Fix a dependency on the internals of libelf's buffer management.

The DTrace previously injected a new symbol table into the output object
by replacing a buffer provided by libelf with a new one. Depending on
how libelf manages its buffers, this can (and does, on FreeBSD) cause a
double free. Instead, add new symbols by adding a new data descriptor to
the symbol table, and inserting the new symbols there.
Add a comment explaining the approach used on FreeBSD.