From: George K. <gwk...@gm...> - 2013-10-07 16:10:33
|
On Sun, Oct 6, 2013 at 2:29 PM, John Bowler < joh...@gm...> wrote: > On Sun, Oct 6, 2013 at 10:25 AM, George King <gwk...@gm...> wrote: > >> Undefined symbols for architecture armv7: >> "_png_read_filter_row_avg3_neon", referenced from: >> _png_init_filter_functions_neon in libpng16.a(arm_init.o) >> > etc > >> "_png_read_filter_row_up_neon", referenced from: >> _png_init_filter_functions_neon in libpng16.a(arm_init.o) >> >> does anyone have any idea what might be going wrong? >> > > It looks like the assembler script you are using is picking up the system > installed pnglibconf.h, not the one you just built. > by 'assembler script' do you mean the libtool generated by configure? (just curious; i'm not very familiar with these tools). > It will probably work just fine if you build in > /Users/gwk/external/libpng-1.6.6. > I tried a ./configure (with the same options minus the --prefix argument) in the libpng root dir and unfortunately got the same linking error. To find out of this is correct hand edit the pnglibconf.h in your build > directory to change the #define of PNG_ARM_NEON_OPT to (say) '42' - it will > be '2' in the file initially. Then add the following to arm/filter_neon.S: > > #if PNG_ARM_NEON_OPT == 42 > #error OK > #endif > > Rebuild filter_neon.o and the assembler (preprocessor) should error out > with 'OK'. If it doesn't that proves the assembler script doesn't know how > to do #includes in split builds (i.e. where source code and build output > are in different directories.) > i do not think this is the issue. i screwed up the first few tests because i didn't realize that pnglibconf.h is generated by the make process, but i'm fairly sure that the generated file is the one being included. to double check, i passed -H as a preprocessor option (print included header paths), which showed the local path for that header. > > Since you are using gas why not use gcc, the GNU wrapper? I test that > (for arm-Linux and arm-android) and it works. > i am trying to build with just the Xcode tools, which no longer include gcc-llvm. > > Also, --enable-arm-neon is no longer necessary and causes problems on iOS > builds because they often compile for multiple targets. Not all ARM v7's > have NEON FPUs, but if all your targets do use '-march=armv7 -mfpu=neon' > (and don't set '--enable-arm-neon'). If some targets do and some don't you > need to built for multiple targets both with and without the FPU option. > thank you for the details. clang supports a -arch flag which i use, and i believe that is equivalent to -march. i am targeting iOS 7 only (oldest supported device is iPhone 4, cortex A8) so I am fairly confident that NEON is present for all targets. my strategy is to build fat static libs by doing separate configure && make install invocations for each architecture. I end up with 5 libs (armv7, armv7s, arm64, i386, x86_64; last two are for the simulators) and lipo them together. any comments on any of this are of course welcome. any other suggestions for how to trace this problem? the last succeeding step creates libpng.a: /bin/sh ./libtool --tag=CC --mode=link /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -O3 -mfpu=neon -no-undefined -export-dynamic -version-number 16:6:0 -export-symbols libpng.sym -arch armv7 -miphoneos-version-min=7.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib -o libpng16.la -rpath /Users/gwk/work/libqk/build/libpng/armv7/install/lib png.lo pngerror.lo pngget.lo pngmem.lo pngpread.lo pngread.lo pngrio.lo pngrtran.lo pngrutil.lo pngset.lo pngtrans.lo pngwio.lo pngwrite.lo pngwtran.lo pngwutil.lo arm_init.lo filter_neon.lo -lz libtool: link: ar cru .libs/libpng16.a png.o pngerror.o pngget.o pngmem.o pngpread.o pngread.o pngrio.o pngrtran.o pngrutil.o pngset.o pngtrans.o pngwio.o pngwrite.o pngwtran.o pngwutil.o arm_init.o filter_neon.o libtool: link: ranlib .libs/libpng16.a libtool: link: ( cd ".libs" && rm -f "libpng16.la" && ln -s "../libpng16.la" "libpng16.la" ) i would think that if the arm_init stuff was really missing then this step would fail too, but it doesn't. instead it's only the pngfix link that fails: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -O3 -mfpu=neon -arch armv7 -miphoneos-version-min=7.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -o pngfix pngfix.o -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib ./.libs/libpng16.a -lz there is no libpng in the ...sdk/usr/lib. i tried inspecting libpng.a with nm, and i see a section of undefined symbols, but i don't know what that means: $ nm -A .libs/libpng16.a | grep png_read_filter .libs/libpng16.a:pngpread.o: U _png_read_filter_row .libs/libpng16.a:pngread.o: U _png_read_filter_row .libs/libpng16.a:pngrutil.o: 00002e70 T _png_read_filter_row .libs/libpng16.a:pngrutil.o: 0000354c t _png_read_filter_row_avg .libs/libpng16.a:pngrutil.o: 000035b0 t _png_read_filter_row_paeth_1byte_pixel .libs/libpng16.a:pngrutil.o: 00003610 t _png_read_filter_row_paeth_multibyte_pixel .libs/libpng16.a:pngrutil.o: 00003508 t _png_read_filter_row_sub .libs/libpng16.a:pngrutil.o: 00003530 t _png_read_filter_row_up .libs/libpng16.a:arm_init.o: U _png_read_filter_row_avg3_neon .libs/libpng16.a:arm_init.o: U _png_read_filter_row_avg4_neon .libs/libpng16.a:arm_init.o: U _png_read_filter_row_paeth3_neon .libs/libpng16.a:arm_init.o: U _png_read_filter_row_paeth4_neon .libs/libpng16.a:arm_init.o: U _png_read_filter_row_sub3_neon .libs/libpng16.a:arm_init.o: U _png_read_filter_row_sub4_neon .libs/libpng16.a:arm_init.o: U _png_read_filter_row_up_neon .libs/libpng16.a:filter_neon.o: 000000e0 T png_read_filter_row_avg3_neon .libs/libpng16.a:filter_neon.o: 000000a0 T png_read_filter_row_avg4_neon .libs/libpng16.a:filter_neon.o: 00000260 T png_read_filter_row_paeth3_neon .libs/libpng16.a:filter_neon.o: 00000158 T png_read_filter_row_paeth4_neon .libs/libpng16.a:filter_neon.o: 0000002c T png_read_filter_row_sub3_neon .libs/libpng16.a:filter_neon.o: 00000000 T png_read_filter_row_sub4_neon .libs/libpng16.a:filter_neon.o: 00000080 T png_read_filter_row_up_neon thanks again for the help! -george |