0

I have a big text file that I want to include in a C program. I could just make it a string literal but it's pretty big and that would be cumbersome. So I'm currently linking like this:

$ ld -r -b binary -o /tmp/stuff.o /tmp/stuff.txt
$ clang -o myprogram main.o /tmp/stuff.o

Objdump output:

$ objdump -t /tmp/stuff.o

/tmp/stuff.o:     file format elf64-x86-64

SYMBOL TABLE:
0000000000000000 l    d  .data  0000000000000000 .data
0000000000000006 g       *ABS*  0000000000000000 _binary__tmp_stuff_txt_size
0000000000000006 g       .data  0000000000000000 _binary__tmp_stuff_txt_end
0000000000000000 g       .data  0000000000000000 _binary__tmp_stuff_txt_start

In the code, I do this (gotten from this question):

extern char _binary__tmp_stuff_txt_start[];
extern char _binary__tmp_stuff_txt_size[];

int f(void) {
  size_t size = (size_t)_binary__tmp_stuff_txt_size;
  do_stuff(size, _binary__tmp_stuff_txt_start);
}

Everything works great, but when I compile with GCC instead of Clang, it segfaults. Looking at it in GDB, the size variable initialized like this size_t size = (size_t)_binary__tmp_stuff_txt_size; is garbage. It seems that when GCC links, it passes the -pie flag to ld but Clang doesn't. I could fix this by just passing -no-pie to GCC, but it seems kindof sad that doing something so simple would prevent using PIE. Is there something I should change to make this work?

marcelo827
  • 44
  • 4

0 Answers0