Gentoo Archives: gentoo-commits

From: "Michael Haubenwallner (haubi)" <haubi@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo-alt r1626 - in trunk/aix-miscutils: . aixdll ldd
Date: Mon, 21 Apr 2008 12:08:48
Message-Id: E1JnupB-0006Xb-9J@stork.gentoo.org
1 Author: haubi
2 Date: 2008-04-21 12:08:44 +0000 (Mon, 21 Apr 2008)
3 New Revision: 1626
4
5 Added:
6 trunk/aix-miscutils/aixdll/
7 trunk/aix-miscutils/aixdll/Makefile.am
8 trunk/aix-miscutils/aixdll/aixdll
9 Modified:
10 trunk/aix-miscutils/Makefile.am
11 trunk/aix-miscutils/configure.ac
12 trunk/aix-miscutils/ldd/ldd
13 Log:
14 added usr/sbin/aixdll script, will be used by gcc-config on aix
15
16 Modified: trunk/aix-miscutils/Makefile.am
17 ===================================================================
18 --- trunk/aix-miscutils/Makefile.am 2008-04-21 09:39:21 UTC (rev 1625)
19 +++ trunk/aix-miscutils/Makefile.am 2008-04-21 12:08:44 UTC (rev 1626)
20 @@ -4,6 +4,6 @@
21
22 AUTOMAKE_OPTIONS = 1.9 dist-bzip2
23
24 -SUBDIRS = ldd
25 +SUBDIRS = ldd aixdll
26
27 MAINTAINERCLEANFILES = Makefile.in aclocal.m4 version configure
28
29 Added: trunk/aix-miscutils/aixdll/Makefile.am
30 ===================================================================
31 --- trunk/aix-miscutils/aixdll/Makefile.am (rev 0)
32 +++ trunk/aix-miscutils/aixdll/Makefile.am 2008-04-21 12:08:44 UTC (rev 1626)
33 @@ -0,0 +1,9 @@
34 +# Copyright 2008 Gentoo Foundation
35 +# Distributed under the terms of the GNU General Public License v2
36 +# Author: Michael Haubenwallner <haubi@g.o>
37 +
38 +sbin_SCRIPTS = aixdll
39 +
40 +EXTRA_DIST = aixdll
41 +
42 +MAINTAINERCLEANFILES = Makefile.in
43
44 Added: trunk/aix-miscutils/aixdll/aixdll
45 ===================================================================
46 --- trunk/aix-miscutils/aixdll/aixdll (rev 0)
47 +++ trunk/aix-miscutils/aixdll/aixdll 2008-04-21 12:08:44 UTC (rev 1626)
48 @@ -0,0 +1,494 @@
49 +#! /usr/bin/env bash
50 +# Copyright 2008 Gentoo Foundation
51 +# Distributed under the terms of the GNU General Public License v2
52 +# Author: Michael Haubenwallner <haubi@g.o>
53 +#
54 +# Utilities for dynamic link libraries (aka. shared objects) on AIX.
55 +#
56 +
57 +PS4='(${LINENO})+ '
58 +
59 +ACTION=${0##*/}
60 +[[ ${ACTION} == 'aixdll-'* ]] && ACTION=${ACTION#aixdll-} || ACTION=
61 +
62 +die() {
63 + [[ $# -gt 0 ]] && echo "${ACTION}: $@" >&2
64 + exit 1
65 +}
66 +
67 +_aixdll_cutoff() {
68 + local line=$1
69 + local minlen=$2
70 + local maxcol=$((${#line}-${minlen}))
71 + local tmpline value
72 + if [[ ${line:$((maxcol-1)):1} != ' ' ]]; then
73 + tmpline=${line:0:${maxcol}}
74 + tmpline=${tmpline% *}
75 + maxcol=$((${#tmpline}+1))
76 + fi
77 + value=${line:${maxcol}}
78 + echo ${value}
79 + echo "${line%${value}}"
80 +}
81 +
82 +_aixdll_read_RUNPATH_DEPLIBS() {
83 + # Reads stdin up to the first empty line.
84 + # The first line on stdin must be:
85 + # "INDEX PATH BASE MEMBER "
86 + # The blank-counts in this line are used to parse the data.
87 + #
88 + # Output:
89 + # Two lines going to stdout:
90 + # "/path1:/path2"
91 + # "'lib1.a(shr1.o)' '/path/lib2.a(shr2.o)' 'lib3.so'"
92 + local line
93 + local runpath= deplibs=
94 + local haveHeader=false
95 + local dynMEMBER dynBASE dynPATH
96 +
97 + # global constants to calculate once only
98 + declare -i PATHlen=0 BASElen=0 MEMBERlen=0
99 + declare -i PATHmin=0 BASEmin=0 MEMBERmin=0
100 +
101 + while IFS= read line
102 + do
103 + # empty line marks end of ImportFileStrings section
104 + [[ ${line} ]] || break
105 + if [[ ${line} == "INDEX "* ]]; then
106 + haveHeader=true
107 + if [[ ${PATHmin} -eq 0 ]]; then
108 + MEMBERlen=${#line}
109 + line=${line%MEMBER *}
110 + MEMBERmin=${#line}
111 + MEMBERlen=$((MEMBERlen-MEMBERmin))
112 + BASElen=${MEMBERmin}
113 + line=${line%BASE *}
114 + BASEmin=${#line}
115 + BASElen=$((BASElen-BASEmin))
116 + PATHlen=${BASEmin}
117 + line=${line%PATH *}
118 + PATHmin=${#line}
119 + PATHlen=$((PATHlen-PATHmin))
120 + fi
121 + continue
122 + fi
123 + ${haveHeader} || continue
124 +
125 + { IFS= read dynMEMBER; IFS= read line; } <<-EOC
126 + $(_aixdll_cutoff "${line}" ${MEMBERlen})
127 + EOC
128 + { IFS= read dynBASE; IFS= read line; } <<-EOC
129 + $(_aixdll_cutoff "${line}" ${BASElen})
130 + EOC
131 + { IFS= read dynPATH; IFS= read line; } <<-EOC
132 + $(_aixdll_cutoff "${line}" ${PATHlen})
133 + EOC
134 +
135 + if [[ ! ${dynBASE} && ${dynPATH} ]]; then
136 + runpath=${dynPATH}
137 + continue
138 + fi
139 +
140 + [[ ${dynBASE} && ${dynBASE} != .. && ${dynBASE} != . ]] || continue
141 +
142 + deplibs="${deplibs} '${dynPATH%/}${dynPATH:+/}${dynBASE}${dynMEMBER:+(}${dynMEMBER}${dynMEMBER:+)}'"
143 + done
144 +
145 + echo "${runpath}"
146 + echo "${deplibs}"
147 +}
148 +
149 +aixdll_query() {
150 + # Uses /usr/bin/dump to extract information from object files
151 + # or archive libraries.
152 + #
153 + # First argument:
154 + # either
155 + # "/bin/true"
156 + # queries binary information from file.
157 + # or
158 + # "/lib/libc.a"
159 + # queries binary information for each archive member.
160 + # or
161 + # "/lib/libc.a(shr.o)"
162 + # queries binary information for specified archive members,
163 + # archive-members can contain shell-wildcards (*?).
164 + # Further arguments:
165 + # any combination of
166 + # FILE MEMBER SHROBJ FLAGS FORMAT RUNPATH DEPLIBS
167 + #
168 + # Output on stdout:
169 + # One line for each file or archive member, to be evaluated in
170 + # another shell environment, setting at least these variables:
171 + # FILE='...';MEMBER='...';SHROBJ=[true|false]
172 + # The format for each variable is
173 + # either (for '/bin/true')
174 + # FILE='/bin/true'
175 + # MEMBER=''
176 + # FLAGS=
177 + # FORMAT=
178 + # RUNPATH=
179 + # DEPLIBS=
180 + # SHROBJ=false
181 + # FLAGS=' RELFLG EXEC LNNO DYNLOAD DEP__SYSTEM '
182 + # FORMAT='32-bit XCOFF'
183 + # RUNPATH='/usr/lib:/lib:/usr/lpp/xlC/lib'
184 + # DEPLIBS=" 'libc.a(shr.o)'"
185 + # or (for '/lib/libc.a')
186 + # FILE='/lib/libc.a'
187 + # MEMBER='ptrgl_64_64.o'
188 + # FLAGS=
189 + # FORMAT=
190 + # RUNPATH=
191 + # DEPLIBS=
192 + # SHROBJ=false
193 + # FLAGS=' DEP_SYSTEM '
194 + # FORMAT='64-bit XCOFF'
195 + # <newline for each archive member>
196 + # FILE='/lib/libc.a'
197 + # MEMBER='shr.o'
198 + # FLAGS=
199 + # FORMAT=
200 + # RUNPATH=
201 + # DEPLIBS=
202 + # SHROBJ=true
203 + # FLAGS=' EXEC DYNLOAD SHROBJ DEP__SYSTEM '
204 + # FORMAT='32-bit XCOFF'
205 + # RUNPATH='/usr/lib:/lib'
206 + # DEPLIBS=" '/unix' 'libcrypt.a(shr.o)'"
207 + # <newline>
208 + # or (for '/lib/libc.a(shr*)')
209 + # FILE='/lib/libc.a'
210 + # MEMBER='shr.o'
211 + # FLAGS=
212 + # FORMAT=
213 + # RUNPATH=
214 + # DEPLIBS=
215 + # SHROBJ=true
216 + # FLAGS=' EXEC DYNLOAD SHROBJ DEP__SYSTEM '
217 + # FORMAT='32-bit XCOFF'
218 + # RUNPATH='/usr/lib:/lib'
219 + # DEPLIBS=" '/unix' 'libcrypt.a(shr.o)'"
220 + # <newline>
221 + # FILE='/lib/libc.a'
222 + # MEMBER='shr_64.o'
223 + # FLAGS=
224 + # FORMAT=
225 + # RUNPATH=
226 + # DEPLIBS=
227 + # SHROBJ=true
228 + # FLAGS=' EXEC DYNLOAD SHROBJ DEP__SYSTEM '
229 + # FORMAT='64-bit XCOFF'
230 + # RUNPATH='/usr/lib:/lib'
231 + # DEPLIBS=" '/unix' 'libcrypt.a(shr_64.o)'"
232 + # <newline>
233 +
234 + local dll=$1 shrobj=
235 + shift
236 + local what="$*"
237 + local dumpopts='vo' line section
238 +
239 + : ${what:="FILE MEMBER SHROBJ FLAGS FORMAT RUNPATH DEPLIBS"}
240 + what=" ${what} "
241 +
242 + if [[ ${dll} == *'('*')'* ]]; then
243 + shrobj=${dll#*(}
244 + shrobj="${shrobj%)}"
245 + dll=${dll%(${shrobj})}
246 + fi
247 +
248 + [[ ${what} == *" RUNPATH "* \
249 + || ${what} == *" DEPLIBS "* \
250 + ]] && dumpopts="${dumpopts}H"
251 +
252 + # sections from 'dump -Hov'
253 + # ***Object Module Header***
254 + # ***Optional Header***
255 + # ***Import File Strings***
256 + # ***Loader Section***
257 + local usethis=false linebreak=: thisshrobj= x
258 + while IFS= read line
259 + do
260 + if [[ ${line} == *: ]]; then
261 + # new archive member
262 + # line="/lib/libc.a[shr.o]:"
263 + usethis=false
264 + if [[ ${line} == "${dll}${shrobj:+[}${shrobj}${shrobj:+]}:" ]] \
265 + || [[ ${line} == "${dll}["${shrobj:-*}"]:" ]] \
266 + ; then
267 + thisshrobj=${line#${dll}}
268 + thisshrobj=${thisshrobj%:}
269 + thisshrobj=${thisshrobj#[}
270 + thisshrobj=${thisshrobj%]}
271 + usethis=true
272 + ${linebreak}
273 + linebreak=echo
274 + for x in ${what}; do
275 + echo -n "${x}=;"
276 + done
277 + [[ ${what} == *" FILE "* ]] &&
278 + echo -n "FILE='${dll}';"
279 + # "FILE='/lib/libc.a'
280 + [[ ${what} == *" MEMBER "* ]] &&
281 + echo -n "MEMBER='${thisshrobj}';"
282 + # "MEMBER='shr.o';"
283 + fi
284 + continue
285 + fi
286 +
287 + ${usethis} || continue
288 +
289 + case "${section},${line}" in
290 + *,) # empty line: end of section
291 + section=
292 + continue
293 + ;;
294 + *,*'***Import File Strings***')
295 + # parse complete section separately using
296 + # _aixdll_read_RUNPATH_DEPLIBS()
297 + { IFS= read line
298 + [[ ${what} == *" RUNPATH "* ]] &&
299 + echo -n "RUNPATH='${line}';"
300 + IFS= read line
301 + [[ ${what} == *" DEPLIBS "* ]] &&
302 + echo -n "DEPLIBS=\"${line}\";"
303 + } <<-EOC
304 + $(_aixdll_read_RUNPATH_DEPLIBS)
305 + EOC
306 + continue
307 + ;;
308 + *,*'***')
309 + # new section
310 + section=${line//\*} # stars
311 + section=${section// } # tabs
312 + section=${section// } # blanks
313 + continue
314 + ;;
315 + "ObjectModuleHeader,Flags="*)
316 + # line="Flags=( EXEC DYNLOAD SHROBJ DEP__SYSTEM )"
317 + if [[ ${what} == *" SHROBJ "* ]]; then
318 + echo -n "SHROBJ="
319 + [[ ${line} == *" SHROBJ "* ]] &&
320 + echo -n "true;" ||
321 + echo -n "false;"
322 + fi
323 + [[ ${what} == *" FLAGS "* ]] || continue
324 + line=${line#Flags=(}
325 + line=${line%)}
326 + echo -n "FLAGS='${line}';"
327 + # "FLAGS=' EXEC DYNLOAD SHROBJ DEP__SYSTEM ';"
328 + continue
329 + ;;
330 + "ObjectModuleHeader,Magic = "*)
331 + # line="Magic = 0x1df (32-bit XCOFF)"
332 + # line="Magic = 0x1f7 (64-bit XCOFF)"
333 + [[ ${what} == *" FORMAT "* ]] || continue
334 + line=${line#Magic = *(}
335 + line=${line%)}
336 + echo -n "FORMAT='${line}';"
337 + # "FORMAT='32-bit XCOFF';"
338 + # "FORMAT='64-bit XCOFF';"
339 + continue
340 + ;;
341 + "ImportFileStrings,INDEX"*)
342 + esac
343 + done <<-EOF
344 + $(/usr/bin/dump -X32_64 -${dumpopts} "${dll}" 2>/dev/null)
345 + EOF
346 + ${linebreak}
347 +}
348 +
349 +aixdll_find_unprepared() {
350 + find "$1" -type f -name 'lib*.a' -print
351 +}
352 +
353 +aixdll_find_prepared() {
354 + find "$1" -type d -name 'lib*.a.d' -print
355 +}
356 +
357 +aixdll_is_prepared() {
358 + local what=$1
359 + [[ ${what##*/} == lib*.a.d ]]
360 +}
361 +
362 +aixdll_get_preparedir_for_lib() {
363 + echo "${1%.d}.d"
364 +}
365 +
366 +aixdll_get_lib_for_preparedir() {
367 + echo "${1%.d}"
368 +}
369 +
370 +aixdll_prepare_for_merge() {
371 + # $0 target-library [source-library]
372 + local libsrc=${2-${1}}
373 + local libad=$(aixdll_get_preparedir_for_lib "${1}")
374 + mkdir -p "${libad}" || die "Cannot create ${libad}"
375 + pushd "${libad}" >/dev/null || die "Cannot cd to ${libad}"
376 + local status
377 + /usr/ccs/bin/ar -X32_64 -x "${libsrc}"
378 + status=$?
379 + popd >/dev/null || die "Cannot cd back from ${libad}"
380 + if [[ ${status} -ne 0 ]]; then
381 + rmdir "${libad}" >&/dev/null
382 + die "Cannot un-ar ${libsrc}"
383 + fi
384 + true
385 +}
386 +
387 +aixdll_finish_merge_single() {
388 + local arg keepdir
389 + local libad
390 + for arg
391 + do
392 + case ${arg} in
393 + --keepdir=*)
394 + keepdir=${arg#*=}
395 + continue
396 + ;;
397 + *)
398 + libad=$(aixdll_get_preparedir_for_lib "${arg}")
399 + ;;
400 + esac
401 + done
402 +
403 + : ${keepdir:=true}
404 +
405 + aixdll_is_prepared "${libad}" || return 0
406 + local liba=$(aixdll_get_lib_for_preparedir "${libad}")
407 + local f
408 +
409 + if [[ -d ${libad} && $(ls -A "${libad}/") ]]; then
410 + pushd "${libad}" >/dev/null || die "Cannot cd to ${libad}"
411 + rm -f "./${liba##*/}.new" || die "Cannot remove ${liba##*/}.new"
412 + /usr/ccs/bin/ar -coqszvl -X 32_64 "./${liba##*/}.new" ./* || die "Cannot recreate ${liba}"
413 + mv -f "./${liba##*/}.new" "${liba}" || die "Cannot move ${liba##*/}.new to ${liba}"
414 + popd >/dev/null || die "Cannot cd back from ${libad}"
415 + elif [[ -f ${liba} ]]; then
416 + rm -f "${liba}" || die "Cannot prune '${liba}'"
417 + keepdir=false
418 + fi
419 +
420 + if [[ -d ${libad} ]] && ! ${keepdir}; then
421 + pushd "${libad}" >/dev/null || die "Cannot cd to ${libad}"
422 + rm -f ./* || die "Cannot prune '${libad}/*'"
423 + popd >/dev/null || die "Cannot cd back from ${libad}"
424 + rmdir "${libad}" || die "Cannot prune '${libad}'"
425 + fi
426 + true
427 +}
428 +
429 +aixdll_finish_merge() {
430 + local arg status keepdir
431 + for arg
432 + do
433 + [[ ${arg} == --keepdir=* ]] && keepdir=${arg#*=}
434 + done
435 +
436 + for arg
437 + do
438 + [[ ${arg} != --* ]] || continue
439 + ( aixdll_finish_merge_single --keepdir=${keepdir} "${arg}" ) || status=$?
440 + done
441 + return ${status}
442 +}
443 +
444 +aixdll_merge_runtime() {
445 + [[ $# -gt 0 ]] || return 0
446 + local arg target current curdir libad finish keepdir
447 + local curdir=$(pwd)
448 + for arg
449 + do
450 + case "${arg}" in
451 + --target=*) target=${arg#*=} ;;
452 + --current=*) current=${arg#*=} ;;
453 + --finish=*) finish=${arg#*=} ;;
454 + --keepdir=*) keepdir=${arg#*=} ;;
455 + --*) die "Invalid argument ${arg}" ;;
456 + esac
457 + done
458 + : ${finish:=true}
459 + [[ ${target} ]] || die "Missing --target"
460 + [[ ${target} == /* ]] || target=${curdir}/${target}
461 + [[ ${current} && ${current} != /* ]] && current=${curdir}/${current}
462 + libad=$(aixdll_get_preparedir_for_lib "${target}")
463 + local line status
464 + local FILE MEMBER SHROBJ FLAGS
465 + for arg
466 + do
467 + [[ ${arg} == '--'* ]] && continue
468 + [[ ${arg} == /* ]] || arg=${curdir}/${arg}
469 +
470 + while IFS= read line
471 + do
472 + [[ ${line} == *SHROBJ=* ]] || continue
473 + eval "${line}"
474 + ${SHROBJ} || continue
475 + mkdir -p "${libad}" || die "Cannot create '${libad}'"
476 + pushd "${libad}" >/dev/null || die "Cannot cd to ${libad}"
477 + /usr/ccs/bin/ar -X32_64 -x "${FILE}" "${MEMBER}"
478 + status=$?
479 + if [[ ${status} -ne 0 ]]; then
480 + popd >/dev/null || die "Cannot cd back from ${libad}"
481 + rmdir "${libad}" >&/dev/null
482 + die "Cannot extract '${MEMBER}' of '${FILE}'"
483 + fi
484 + if [[ ${arg} != "${current}" ]]; then
485 + [[ ${FLAGS} == *" LOADONLY "* ]] ||
486 + /usr/ccs/bin/strip -e "./${MEMBER}" ||
487 + die "Cannot set flag LOADONLY for ${MEMBER}"
488 + else
489 + [[ ${FLAGS} != *" LOADONLY "* ]] ||
490 + /usr/ccs/bin/strip -E "./${MEMBER}" ||
491 + die "Cannot drop flag LOADONLY from ${MEMBER}"
492 + fi
493 + popd >/dev/null || die "Cannot cd back from ${libad}"
494 + done <<-EOF
495 + $(aixdll_query "${arg}" FILE MEMBER SHROBJ FLAGS)
496 + EOF
497 + :
498 + done
499 + ${finish} || return 0
500 + aixdll_finish_merge --keepdir=${keepdir} "${libad}"
501 +}
502 +
503 +aixdll_help() {
504 + cat <<EOF
505 +Known actions:
506 + --query
507 + --find-unprepared
508 + --find-prepared
509 + --is-prepared
510 + --prepare-for-merge
511 + --finish-merge
512 + --merge-runtime
513 +EOF
514 +}
515 +
516 +aixdll_main() {
517 + : ${ACTION:=help}
518 + while [[ ${1:+set} ]]
519 + do
520 + case ${1} in
521 + --help | \
522 + --query | \
523 + --find-unprepared | \
524 + --find-prepared | \
525 + --is-prepared | \
526 + --prepare-for-merge | \
527 + --finish-merge | \
528 + --merge-runtime )
529 + ACTION=${1#--}
530 + ;;
531 + --debug) set -x ;;
532 + *) break ;;
533 + esac
534 + shift
535 + done
536 +
537 + aixdll_${ACTION//-/_} "$@"
538 +}
539 +
540 +aixdll_main "$@"
541 +
542 +exit $?
543
544
545 Property changes on: trunk/aix-miscutils/aixdll/aixdll
546 ___________________________________________________________________
547 Name: svn:executable
548 + *
549
550 Modified: trunk/aix-miscutils/configure.ac
551 ===================================================================
552 --- trunk/aix-miscutils/configure.ac 2008-04-21 09:39:21 UTC (rev 1625)
553 +++ trunk/aix-miscutils/configure.ac 2008-04-21 12:08:44 UTC (rev 1626)
554 @@ -9,5 +9,5 @@
555 AC_PREREQ(2.52)
556 AC_CANONICAL_HOST
557 AM_INIT_AUTOMAKE
558 -AC_CONFIG_FILES(./Makefile ldd/Makefile)
559 +AC_CONFIG_FILES(./Makefile ldd/Makefile aixdll/Makefile)
560 AC_OUTPUT
561
562 Modified: trunk/aix-miscutils/ldd/ldd
563 ===================================================================
564 --- trunk/aix-miscutils/ldd/ldd 2008-04-21 09:39:21 UTC (rev 1625)
565 +++ trunk/aix-miscutils/ldd/ldd 2008-04-21 12:08:44 UTC (rev 1626)
566 @@ -11,7 +11,6 @@
567 declare -i PATHmin=0 BASEmin=0 MEMBERmin=0
568
569 declare -i PATHcol=0 BASEcol=0 MEMBERcol=0
570 -declare -i MAXCOL=0
571
572 declare -r NOTFOUND=" => not found"
573
574
575 --
576 gentoo-commits@l.g.o mailing list