Используя readelf, мы можем отделить часть данных от файла elf (используя shell). Можно ли сделать то же самое с программой на C?
Используйте для этой цели libelf.
libelf
http://mdsp.googlecode.com/files/libelf-by-example-20100112.pdf
readelf сама программа написана на C. Поэтому ответ - да.
readelf
Если вы работаете в дистрибутиве linux, похожем на debian, вы можете получить источник readelf, набрав apt-get source binutils и посмотреть, как это делается.
apt-get source binutils