Baris Aktemur
2013-Jan-05 14:58 UTC
[LLVMdev] RuntimeDyld bug in resolving addresses with offset?
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>
Reasonably Related Threads
- [LLVMdev] Dynamically loading native code generated from LLVM IR
- [LLVMdev] Dynamically loading native code generated from LLVM IR
- [LLVMdev] Dynamically loading native code generated from LLVM IR
- [LLVMdev] Dynamically loading native code generated from LLVM IR
- [LLVMdev] Programmatically converting LLVM IR to native code