Hi,
Riku Voipio told me make check was failing on ARM; see:
http://experimental.debian.net/fetch.php?&pkg=mpeg2dec&ver=0.5.1-1&arch=armel&stamp=1229436558&file=log&as=raw
these are symbols in an ARM specific assembly file. See attached patch
60_arm-private-symbols for a fix.
However even with this patch, the testsuite doesn't pass because a) it
checks all object files instead of the final object files (i.e. the
libs) and b) it uses nm which will report all global symbols in object
files, ignoring the visibility attribute (these symbols are necessarily
globals, yet aren't part of the ABI because they are of internal
visibility).
So I rewrote the globals test to verify the shared libraries, to check
for more things, and to avoid duplication. See attached patch
61_global-symbol-test. Note however than in a --disable-shared build,
this test is now a no-op. I think that's good enough as I expect
distros and upstream releases to make check with shared libs enabled.
If we want to run this check on static libraries, it will need to be
based on something else than nm, perhaps objdump, and is likely to be
more complex (objdump output is more complex and we need to test for
scope and visibility ourselves).
Cheers,
--
Loïc Minier
Set visibility of global symbols used in ARM specific assembly file to
internal; spotted my make check on armel; thanks Riku Voipio for the report.
--- a/libmpeg2/motion_comp_arm_s.S
+++ b/libmpeg2/motion_comp_arm_s.S
@@ -23,7 +23,8 @@
@ ----------------------------------------------------------------
.align
- .global MC_put_o_16_arm
+ .global MC_put_o_16_arm
+ .internal MC_put_o_16_arm
MC_put_o_16_arm:
@@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height)
pld [r1]
@@ -83,7 +84,8 @@
@ ----------------------------------------------------------------
.align
- .global MC_put_o_8_arm
+ .global MC_put_o_8_arm
+ .internal MC_put_o_8_arm
MC_put_o_8_arm:
@@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height)
pld [r1]
@@ -152,7 +154,8 @@
.endm
.align
- .global MC_put_x_16_arm
+ .global MC_put_x_16_arm
+ .internal MC_put_x_16_arm
MC_put_x_16_arm:
@@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height)
pld [r1]
@@ -244,7 +247,8 @@
@ ----------------------------------------------------------------
.align
- .global MC_put_x_8_arm
+ .global MC_put_x_8_arm
+ .internal MC_put_x_8_arm
MC_put_x_8_arm:
@@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height)
pld [r1]
Rewrite the public symbol check to verify the shared libraries, to check for
more things, and to avoid duplication; fixes make check on ARM
--- a/test/globals
+++ b/test/globals
@@ -1,4 +1,8 @@
#!/bin/sh
+# TODO
+# - fix checking of .a libs; problem is that "nm -g --defined-only" lists
+# internal symbols; this can be solved by using objdump, but it's probably
+# good enough to just run the tests on the shared lib
if test x"$srcdir" != x""; then
builddir="." # running from make check, but it does not define that
@@ -14,22 +18,30 @@
error=0
-bad_globals=`nm -g --defined-only $builddir/../libmpeg2/*.o |\
- awk '{if ($3) print $3}' | grep -v '^_\?mpeg2_'`
-
-if test x"$bad_globals" != x""; then
- echo BAD GLOBAL SYMBOLS:
- for s in $bad_globals; do echo $s; done
+# check_bad_public_symbols <symbol prefix> <lib file> [<lib file>...]
+#
+# checks public symbols in shared libs:
+# - allow prefix_anything
+# - reject _prefixanything
+# - allow _anything
+# - reject anything else
+#
+# NB: skips missing files
+check_bad_public_symbols() {
+ symbols_prefix="$1"
+ shift
+ lib_files=`ls "$@" 2>/dev/null`
+ [ -z "$lib_files" ] && return
+ bad_globals=`nm -g --defined-only $lib_files |
+ awk '{if ($3) print $3}' |
+ sed -n "/^${symbols_prefix}_/ d; /^_${symbols_prefix}/ { p; d }; /^_/ d; p"`
+ [ -z "$bad_globals" ] && return
error=1
-fi
-
-bad_globals=`nm -g --defined-only $builddir/../libmpeg2/convert/*.o |\
- awk '{if ($3) print $3}' | grep -v '^_\?mpeg2convert_'`
+ echo BAD GLOBAL SYMBOLS in $lib_files:
+ echo "$bad_globals"
+}
-if test x"$bad_globals" != x""; then
- echo BAD GLOBAL SYMBOLS:
- for s in $bad_globals; do echo $s; done
- error=1
-fi
+check_bad_public_symbols mpeg2 $builddir/../libmpeg2/.libs/libmpeg2.so
+check_bad_public_symbols mpeg2convert $builddir/../libmpeg2/convert/.libs/libmpeg2convert.so
exit $error
------------------------------------------------------------------------------
_______________________________________________
Libmpeg2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmpeg2-devel