[LLVMdev] RuntimeDyld bug in resolving addresses with offset?

Baris Aktemur baris.aktemur at ozyegin.edu.tr
Sat Jan 5 06:58:48 PST 2013


Hi,

I believe I came across a bug in RuntimeDyld. I have the following piece of C code (attached as rtdyldbug.c):

double numbers[5] = {33, 34, 35, 36, 37};

void foo(double val, double other[]) {
  other[2] += val * numbers[4];
}

I adapted llvm-rtdyld.cpp to load the .o file of the code above, get a pointer to foo, and invoke it (whole thing is attached as myrtdyld.cpp):

typedef void(*myFun)(double, double*);

int main() {
  std::string funName = "_foo";
  std::string fileName = "rtdyldbug.o";
  myFun fptr = (myFun)getFunctionPointer(funName, fileName);

  double w[5] = {0, 0, 0, 0, 0};
  fptr(4, w);

  printf("%f \n", w[2]); 
  return 0;
}

The printed result should be 148, but its 132. The instruction which reads numbers[4] is

mulsd	_numbers+0x00000020(%rip),%xmm0

When I did debugging at the assembly level, I found that the offset 0x20 is ignored. The resolved address points to numbers[0] instead of numbers[4].

I compiled the attached rtdyldbug.c as "clang -c -o rtdyldbug.o rtdyldbug.c". I compiled myrtdyld.cpp as "clang++ -o myrtdyld myrtdyld.cpp `llvm-config --cxxflags --libs all --ldflags`". I did the test on Mac OS with clang version 3.3 (trunk 170267).

Any insights/comments/bug fixes would be appreciated.

-Baris Aktemur


-------------- next part --------------
A non-text attachment was scrubbed...
Name: rtdyldbug.c
Type: application/octet-stream
Size: 119 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130105/88e547f6/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: myrtdyld.cpp
Type: application/octet-stream
Size: 5657 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130105/88e547f6/attachment-0001.obj>


More information about the llvm-dev mailing list