1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
Upstream-Status: Unknown
Signed-off-by: Khem Raj <raj.khem@gmail.com>
libluajit is having symbols that can't be
resolved the reloc cannot accommodate an offset greater than 24 bits.
Looking at libluajit with readelf -r, you see a bunch of entries that look like:
000082f0 00003c0a R_PPC_REL24 00000000 sqrt + 0
These should not occur when the code is compiled and linked with -fPIC.
It turns out that libluajit *is* compiled and linked with -fPIC, however...
There is one assembler file called lj_vm.s which is generated during the build.
This file is missing the `@plt' qualifier from external references.
This file is generated by a program called buildvm. This in turn uses tables
in a file called buildvm_arch.h which is generated by dynasm.lua.
Index: LuaJIT-2.0.1/src/host/buildvm.c
===================================================================
--- LuaJIT-2.0.1.orig/src/host/buildvm.c 2013-02-19 12:15:00.000000000 -0800
+++ LuaJIT-2.0.1/src/host/buildvm.c 2013-05-14 20:26:05.933444512 -0700
@@ -107,12 +107,14 @@
#endif
sprintf(name, "%s%s%s", symprefix, prefix, suffix);
p = strchr(name, '@');
+#if 0
if (p) {
if (!LJ_64 && (ctx->mode == BUILD_coffasm || ctx->mode == BUILD_peobj))
name[0] = '@';
else
*p = '\0';
}
+#endif
p = (char *)malloc(strlen(name)+1); /* MSVC doesn't like strdup. */
strcpy(p, name);
return p;
Index: LuaJIT-2.0.1/src/vm_ppcspe.dasc
===================================================================
--- LuaJIT-2.0.1.orig/src/vm_ppcspe.dasc 2013-02-19 12:15:00.000000000 -0800
+++ LuaJIT-2.0.1/src/vm_ppcspe.dasc 2013-05-14 20:26:05.937444512 -0700
@@ -1390,7 +1390,7 @@
| checknum CARG2
| evmergehi CARG1, CARG2, CARG2
| checkfail ->fff_fallback
- | bl extern func
+ | bl extern func@plt
| evmergelo CRET1, CRET1, CRET2
| b ->fff_restv
|.endmacro
@@ -1405,7 +1405,7 @@
| checknum CARG1
| evmergehi CARG3, CARG4, CARG4
| checkanyfail ->fff_fallback
- | bl extern func
+ | bl extern func@plt
| evmergelo CRET1, CRET1, CRET2
| b ->fff_restv
|.endmacro
@@ -1437,7 +1437,7 @@
| checknum CARG2
| evmergehi CARG1, CARG2, CARG2
| checkfail ->fff_fallback
- | bl extern log
+ | bl extern log@plt
| evmergelo CRET1, CRET1, CRET2
| b ->fff_restv
|
@@ -1471,7 +1471,7 @@
| checknum CARG1
| checkanyfail ->fff_fallback
| efdctsi CARG3, CARG4
- | bl extern ldexp
+ | bl extern ldexp@plt
| evmergelo CRET1, CRET1, CRET2
| b ->fff_restv
|
@@ -1484,7 +1484,7 @@
| checkfail ->fff_fallback
| la CARG3, DISPATCH_GL(tmptv)(DISPATCH)
| lwz PC, FRAME_PC(BASE)
- | bl extern frexp
+ | bl extern frexp@plt
| lwz TMP1, DISPATCH_GL(tmptv)(DISPATCH)
| evmergelo CRET1, CRET1, CRET2
| efdcfsi CRET2, TMP1
@@ -1503,7 +1503,7 @@
| checkfail ->fff_fallback
| la CARG3, -8(BASE)
| lwz PC, FRAME_PC(BASE)
- | bl extern modf
+ | bl extern modf@plt
| evmergelo CRET1, CRET1, CRET2
| la RA, -8(BASE)
| evstdd CRET1, 0(BASE)
@@ -2399,7 +2399,7 @@
| checknum CARG1
| evmergehi CARG3, CARG4, CARG4
| checkanyfail ->vmeta_arith_vv
- | bl extern pow
+ | bl extern pow@plt
| evmergelo CRET2, CRET1, CRET2
| evstddx CRET2, BASE, RA
| ins_next
|