1 |
Author: haubi |
2 |
Date: 2008-02-06 14:55:40 +0000 (Wed, 06 Feb 2008) |
3 |
New Revision: 1605 |
4 |
|
5 |
Modified: |
6 |
trunk/toolchain-prefix-wrapper/ld/aixplugin.c |
7 |
Log: |
8 |
fixed aix plugin to behave more like aix system ld regarding options |
9 |
-bsvr4, -R<runpath>, -blibpath:<runpath>, -bnolibpath. But still |
10 |
keep extension to understand "-R<runpath>" even without "-bsvr4". |
11 |
|
12 |
|
13 |
Modified: trunk/toolchain-prefix-wrapper/ld/aixplugin.c |
14 |
=================================================================== |
15 |
--- trunk/toolchain-prefix-wrapper/ld/aixplugin.c 2008-02-06 14:52:55 UTC (rev 1604) |
16 |
+++ trunk/toolchain-prefix-wrapper/ld/aixplugin.c 2008-02-06 14:55:40 UTC (rev 1605) |
17 |
@@ -25,8 +25,11 @@ |
18 |
int err; |
19 |
StringList *defaultRunpathList = NULL; |
20 |
StringList *runpathList = NULL; |
21 |
+ StringList *aixRunpathList = NULL; |
22 |
String const *argString; |
23 |
String *newString = NULL; |
24 |
+ char libpath2runpath = 1; /* whether to record -L as runpath */ |
25 |
+ char svr4mode = 0; /* whether we are in -bsvr4 mode */ |
26 |
char const *argBuffer; |
27 |
int argBufferLength; |
28 |
|
29 |
@@ -41,20 +44,62 @@ |
30 |
if (runpathList == NULL) |
31 |
break; |
32 |
|
33 |
- /* always pass "-brtl" */ |
34 |
- if (StringListAppendConcat(data->out->argList, "-brtl", 5, NULL) < 0) |
35 |
+ aixRunpathList = StringListCreate(NULL, 0, 0); |
36 |
+ if (aixRunpathList == NULL |
37 |
+ || StringListAppendConcat(aixRunpathList, "/usr/lib", strlen("/usr/lib"), NULL) < 0 |
38 |
+ || StringListAppendConcat(aixRunpathList, "/lib", strlen("/lib"), NULL) < 0 |
39 |
+ ) break; |
40 |
+ |
41 |
+ /* always use runtime linking (-brtl) */ |
42 |
+ if (StringListAppendConcat(data->out->argList, "-brtl", strlen("-brtl"), NULL) < 0) |
43 |
break; |
44 |
|
45 |
+ /* detect if we are in svr4 mode (-bsvr4). |
46 |
+ * "-R runpath" is only accepted in svr4 mode, |
47 |
+ * but we add "-R runpath" as extension in normal mode to add default runpath. |
48 |
+ */ |
49 |
for(argc = 1; argc < StringListGetSize(data->in->argList); argc++) { |
50 |
argString = StringListGetString(data->in->argList, argc); |
51 |
argBuffer = StringGetBuffer(argString); |
52 |
+ if (strcmp(argBuffer, "-bsvr4") == 0) { |
53 |
+ svr4mode = 1; |
54 |
+ } |
55 |
+ } |
56 |
+ |
57 |
+ for(argc = 1; argc < StringListGetSize(data->in->argList); argc++) { |
58 |
+ argString = StringListGetString(data->in->argList, argc); |
59 |
+ argBuffer = StringGetBuffer(argString); |
60 |
argBufferLength = StringGetLength(argString); |
61 |
|
62 |
- if (strncmp(argBuffer, "-blibpath:", 10) == 0) { |
63 |
+ if (strcmp(argBuffer, "-bnolibpath") == 0) { |
64 |
+ /* explicitly specified: |
65 |
+ * do not record -L path as runpath, specified explicitly. |
66 |
+ */ |
67 |
+ libpath2runpath = 0; |
68 |
+ /* This also removes each runpath specified before. */ |
69 |
+ StringListClear(runpathList); |
70 |
+ if (svr4mode) { |
71 |
+ /* if not in svr4-mode, we accept -R as extension */ |
72 |
+ StringListClear(defaultRunpathList); |
73 |
+ } |
74 |
+ continue; |
75 |
+ } else |
76 |
+ if (strncmp(argBuffer, "-blibpath:", strlen("-blibpath:")) == 0) { |
77 |
char const *curr, *next; |
78 |
|
79 |
- argBuffer += 10; |
80 |
+ argBuffer += strlen("-blibpath:"); |
81 |
|
82 |
+ /* do not record -L path as runpath, we have explicit -blibpath: */ |
83 |
+ libpath2runpath = 0; |
84 |
+ |
85 |
+ /* '-blibpath:' kills previous '-blibpath:' */ |
86 |
+ StringListClear(runpathList); |
87 |
+ |
88 |
+ if (svr4mode) { |
89 |
+ /* it also kills previous '-Rrunpathlist' in svr4mode */ |
90 |
+ StringListClear(defaultRunpathList); |
91 |
+ } |
92 |
+ |
93 |
for(curr = next = argBuffer; *next != '\0'; curr = next+1) { |
94 |
for(next = curr; *next != '\0' && *next != ':'; next++); |
95 |
|
96 |
@@ -63,12 +108,11 @@ |
97 |
continue; |
98 |
} |
99 |
|
100 |
- /* search default path list */ |
101 |
- if (StringListContains(data->in->sysLibpath, curr, next - curr)) |
102 |
- continue; |
103 |
- |
104 |
/* unique out runpath */ |
105 |
- if (StringListContains(runpathList, curr, next - curr)) |
106 |
+ if (StringListContains(runpathList, curr, next - curr) |
107 |
+ || StringListContains(data->in->sysLibpath, curr, next - curr) |
108 |
+ || StringListContains(aixRunpathList, curr, next - curr) |
109 |
+ ) |
110 |
continue; |
111 |
|
112 |
/* record this path into runpath list */ |
113 |
@@ -79,13 +123,19 @@ |
114 |
/* end "-blibpath:" handling */ |
115 |
continue; |
116 |
} else |
117 |
- if (strncmp(argBuffer, "-R", 2) == 0) { |
118 |
+ if (strncmp(argBuffer, "-R", strlen("-R")) == 0) { |
119 |
/* extension: |
120 |
* collect additional default runpath from "-R runpath" |
121 |
*/ |
122 |
|
123 |
- argBuffer += 2; |
124 |
- argBufferLength -= 2; |
125 |
+ if (svr4mode) { |
126 |
+ /* in svr4 mode, '-R' kills previous '-blibpath:' arguments. |
127 |
+ * in normal mode, we implement -R as an extension. |
128 |
+ */ |
129 |
+ StringListClear(runpathList); |
130 |
+ } |
131 |
+ argBuffer += strlen("-R"); |
132 |
+ argBufferLength -= strlen("-R"); |
133 |
|
134 |
if (*argBuffer == 0 && argc < StringListGetSize(data->in->argList)) { |
135 |
argc++; |
136 |
@@ -93,7 +143,10 @@ |
137 |
argBuffer = StringGetBuffer(argString); |
138 |
argBufferLength = StringGetLength(argString); |
139 |
} |
140 |
- if (StringListContains(data->in->sysLibpath, argBuffer, argBufferLength)) |
141 |
+ if (StringListContains(defaultRunpathList, argBuffer, argBufferLength) |
142 |
+ || StringListContains(data->in->sysLibpath, argBuffer, argBufferLength) |
143 |
+ || StringListContains(aixRunpathList, argBuffer, argBufferLength) |
144 |
+ ) |
145 |
continue; |
146 |
|
147 |
if (StringListAppendConcat(defaultRunpathList, argBuffer, argBufferLength, NULL) < 0) |
148 |
@@ -118,14 +171,16 @@ |
149 |
if (StringListAppendList(runpathList, data->in->sysRunpath, 0, -1) < 0) |
150 |
break; |
151 |
|
152 |
- /* need to add /usr/lib:/lib to explicit runpath if any */ |
153 |
- if (StringListAppendConcat(runpathList, "/usr/lib", 8, NULL) < 0) |
154 |
+ /* need to add /usr/lib:/lib myself */ |
155 |
+ if (StringListAppendList(runpathList, aixRunpathList, 0, -1) < 0) |
156 |
break; |
157 |
- if (StringListAppendConcat(runpathList, "/lib", 4, NULL) < 0) |
158 |
- break; |
159 |
|
160 |
/* create runpath string: "-blibpath:libpath1:libpathN" */ |
161 |
- newString = StringListJoin(runpathList, "-blibpath:", strlen("-blibpath:"), ":", strlen(":"), NULL, 0); |
162 |
+ newString = StringListJoin(runpathList |
163 |
+ , "-blibpath:", strlen("-blibpath:") /* start */ |
164 |
+ , ":", strlen(":") /* separator */ |
165 |
+ , NULL, 0 /* end */ |
166 |
+ ); |
167 |
if (newString == NULL) |
168 |
break; |
169 |
|
170 |
@@ -140,9 +195,10 @@ |
171 |
err = 0; |
172 |
} while(0); /* end dummy loop */ |
173 |
|
174 |
- if (newString != NULL) newString = StringDestroy(newString); |
175 |
- if (runpathList != NULL) runpathList = StringListDestroy(runpathList); |
176 |
- if (defaultRunpathList != NULL) defaultRunpathList = StringListDestroy(defaultRunpathList); |
177 |
+ newString = StringDestroy(newString); |
178 |
+ runpathList = StringListDestroy(runpathList); |
179 |
+ defaultRunpathList = StringListDestroy(defaultRunpathList); |
180 |
+ aixRunpathList = StringListDestroy(aixRunpathList); |
181 |
|
182 |
return err; |
183 |
} |
184 |
|
185 |
-- |
186 |
gentoo-commits@l.g.o mailing list |