--- /dev/null
+#ifndef __LIBELFU_DEBUG_H_
+#define __LIBELFU_DEBUG_H_
+
+#include <stdio.h>
+
+
+#define ELFU_WARN(...) do { fprintf(stderr, __VA_ARGS__); } while(0)
+
+#define ELFU_WARNELF(function_name) ELFU_WARN(function_name "() failed: %s\n", elf_errmsg(-1))
+
+#endif
#include <libelfu/modeltypes.h>
#include <libelfu/modelops.h>
+#include <libelfu/debug.h>
#endif
-#include <stdio.h>
-
#include <libelf/libelf.h>
#include <libelf/gelf.h>
+#include <libelfu/debug.h>
+
+
void elfu_ePhdrFixupSelfRef(Elf *e)
{
GElf_Ehdr ehdr;
size_t i, n;
if (!gelf_getehdr(e, &ehdr)) {
- fprintf(stderr, "gelf_getehdr() failed: %s.", elf_errmsg(-1));
+ ELFU_WARNELF("gelf_getehdr");
return;
}
if (elf_getphdrnum(e, &n)) {
- fprintf(stderr, "elf_getphdrnum() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("elf_getphdrnum");
}
for (i = 0; i < n; i++) {
GElf_Phdr phdr;
if (gelf_getphdr(e, i, &phdr) != &phdr) {
- fprintf(stderr, "gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1));
+ ELFU_WARN("gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1));
continue;
}
phdr.p_memsz = phdr.p_filesz;
if (!gelf_update_phdr (e, i, &phdr)) {
- fprintf(stderr, "gelf_update_ehdr() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("gelf_update_ehdr");
}
}
}
-#include <stdio.h>
#include <stdlib.h>
#include <libelf/libelf.h>
GElf_Shdr shdr;
if (gelf_getshdr(scn, &shdr) != &shdr) {
- fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("gelf_getshdr");
continue;
}
#include <assert.h>
-#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <libelfu/libelfu.h>
numSecs = elfu_mCountScns(me);
sortedSecs = malloc(numSecs * sizeof(*sortedSecs));
if (!sortedSecs) {
- fprintf(stderr, "elfu_check: Failed to allocate memory.\n");
+ ELFU_WARN("elfu_check: Failed to allocate memory.\n");
}
i = 0;
for (i = 0; i < numSecs - 1; i++) {
if (sortedSecs[i]->shdr.sh_offset + elfu_gScnSizeFile(&sortedSecs[i]->shdr)
> sortedSecs[i+1]->shdr.sh_offset) {
- fprintf(stderr, "elfu_check: Found overlapping sections: %s and %s.\n",
- elfu_mScnName(me, sortedSecs[i]),
- elfu_mScnName(me, sortedSecs[i+1]));
+ ELFU_WARN("elfu_check: Found overlapping sections: %s and %s.\n",
+ elfu_mScnName(me, sortedSecs[i]),
+ elfu_mScnName(me, sortedSecs[i+1]));
}
}
/* Check for sections overlapping with EHDR */
for (i = 0; i < numSecs; i++) {
if (sortedSecs[i]->shdr.sh_offset < me->ehdr.e_ehsize) {
- fprintf(stderr, "elfu_check: Found section overlapping with EHDR: %s.\n",
- elfu_mScnName(me, sortedSecs[i]));
+ ELFU_WARN("elfu_check: Found section overlapping with EHDR: %s.\n",
+ elfu_mScnName(me, sortedSecs[i]));
}
}
elfu_gScnSizeFile(&sortedSecs[i]->shdr),
me->ehdr.e_phoff,
me->ehdr.e_phentsize * me->ehdr.e_phnum)) {
- fprintf(stderr, "elfu_check: Found section overlapping with PHDRs: %s.\n",
- elfu_mScnName(me, sortedSecs[i]));
+ ELFU_WARN("elfu_check: Found section overlapping with PHDRs: %s.\n",
+ elfu_mScnName(me, sortedSecs[i]));
}
}
#include <assert.h>
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
* to be filled. This means that it relies on the NOBITS area
* being actually 0 bytes, and the expansion would ruin it.
*/
- fprintf(stderr, "mExpandNobits: Found PHDR spanning expansion offset. Aborting.\n");
+ ELFU_WARN("mExpandNobits: Found PHDR spanning expansion offset. Aborting.\n");
return;
}
} else {
ms->data.d_buf = malloc(ms->shdr.sh_size);
memset(ms->data.d_buf, '\0', ms->shdr.sh_size);
if (!ms->data.d_buf) {
- fprintf(stderr, "mExpandNobits: Could not allocate %jd bytes for NOBITS expansion.\n", ms->shdr.sh_size);
+ ELFU_WARN("mExpandNobits: Could not allocate %jd bytes for NOBITS expansion.\n", ms->shdr.sh_size);
}
ms->data.d_align = 1;
#include <assert.h>
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
if (gelf_getshdr(scn, &ms->shdr) != &ms->shdr) {
- fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARN("gelf_getshdr() failed: %s\n", elf_errmsg(-1));
goto out;
}
ms->data.d_buf = malloc(ms->shdr.sh_size);
if (!ms->data.d_buf) {
- fprintf(stderr, "modelFromSection: Could not allocate data buffer (%jx bytes).\n", ms->shdr.sh_size);
+ ELFU_WARN("modelFromSection: Could not allocate data buffer (%jx bytes).\n", ms->shdr.sh_size);
goto out;
}
while (data) {
if (data->d_off + data->d_size > ms->shdr.sh_size) {
- fprintf(stderr, "modelFromSection: libelf delivered a bogus data blob. Skipping\n");
+ ELFU_WARN("modelFromSection: libelf delivered a bogus data blob. Skipping\n");
} else {
memcpy(ms->data.d_buf + data->d_off, data->d_buf, data->d_size);
}
*/
me->elfclass = gelf_getclass(e);
if (me->elfclass == ELFCLASSNONE) {
- fprintf(stderr, "getclass() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("getclass");
}
if (!gelf_getehdr(e, &me->ehdr)) {
- fprintf(stderr, "gelf_getehdr() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("gelf_getehdr");
goto out;
}
* Segments
*/
if (elf_getphdrnum(e, &n)) {
- fprintf(stderr, "elf_getphdrnum() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("elf_getphdrnum");
}
for (i = 0; i < n; i++) {
ElfuPhdr *mp;
if (gelf_getphdr(e, i, &phdr) != &phdr) {
- fprintf(stderr, "gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1));
+ ELFU_WARN("gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1));
break;
}
-#include <stdio.h>
#include <stdlib.h>
#include <libelf/libelf.h>
#include <libelf/gelf.h>
}
if (!gelf_newphdr(e, i)) {
- fprintf(stderr, "gelf_newphdr() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("gelf_newphdr");
}
/* Copy PHDRs */
i = 0;
CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
if (!gelf_update_phdr (e, i, &mp->phdr)) {
- fprintf(stderr, "gelf_update_phdr() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("gelf_update_phdr");
}
i++;
scnOut = elf_newscn(e);
if (!scnOut) {
- fprintf(stderr, "elf_newscn() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("elf_newscn");
return;
}
/* SHDR */
if (!gelf_update_shdr(scnOut, &ms->shdr)) {
- fprintf(stderr, "gelf_update_shdr() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("gelf_update_shdr");
}
if (ms->data.d_buf) {
Elf_Data *dataOut = elf_newdata(scnOut);
if (!dataOut) {
- fprintf(stderr, "elf_newdata() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("elf_newdata");
}
dataOut->d_align = ms->data.d_align;
/* EHDR */
if (!gelf_newehdr(e, me->elfclass)) {
- fprintf(stderr, "gelf_newehdr() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("gelf_newehdr");
}
if (!gelf_update_ehdr(e, &me->ehdr)) {
- fprintf(stderr, "gelf_update_ehdr() failed: %s\n", elf_errmsg(-1));
+ ELFU_WARNELF("gelf_update_ehdr");
}