Description of problem: Trying to compile trang (http://www.thaiopensource.com/relaxng/trang.html; src.rpm attached) and although rpmbuild runs successfully (with myriad warnings about deprecated methods, but no error) resulting binary doesn't work: [matej@hubmaier rpm]$ sudo rpm -Uvh RPMS/x86_64/trang-*Password: Preparing... ########################################### [100%] 1:trang ########################################### [ 50%] 2:trang-debuginfo ########################################### [100%] [matej@hubmaier rpm]$ trang libgcj failure: gcj linkage error. Incorrect library ABI version detected. Aborting. Neúspěšně ukončen (SIGABRT) [matej@hubmaier rpm]$ ldd /usr/bin/trang libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000033d9e00000) libgcj.so.8rh => /usr/lib64/libgcj.so.8rh (0x00000036f6200000) libm.so.6 => /lib64/libm.so.6 (0x00000033cc800000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00000033cd400000) librt.so.1 => /lib64/librt.so.1 (0x0000003334e00000) libz.so.1 => /lib64/libz.so.1 (0x00000033cd000000) libdl.so.2 => /lib64/libdl.so.2 (0x00000033ccc00000) libc.so.6 => /lib64/libc.so.6 (0x00000033cc400000) /lib64/ld-linux-x86-64.so.2 (0x00000033cb400000) [matej@hubmaier rpm]$ When running .jar file from the upstream site with both IcedTea and gij everything works fine: [matej@hubmaier rpm]$ java -version openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-matej_18_jun_2007_12_11-b00) OpenJDK 64-Bit Server VM (build 1.7.0-internal-matej_18_jun_2007_12_11-b00, mixed mode) [matej@hubmaier rpm]$ java -jar ~/.java/classes/trang.jar fatal: at least two arguments are required Trang version 20030619 usage: java com.thaiopensource.relaxng.translate.Driver [-I rng|rnc|dtd|xml] [-O rng|rnc|dtd|xsd] [-i input-param] [-o output-param] inputFileOrUri ... outputFile [matej@hubmaier rpm]$ gij -jar ~/.java/classes/trang.jar fatal: at least two arguments are required Trang version 20030619 usage: java com.thaiopensource.relaxng.translate.Driver [-I rng|rnc|dtd|xml] [-O rng|rnc|dtd|xsd] [-i input-param] [-o output-param] inputFileOrUri ... outputFile [matej@hubmaier rpm]$ gij -version java version "1.5.0" gij (GNU libgcj) version 4.1.2 20070502 (Red Hat 4.1.2-12) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. [matej@hubmaier rpm]$ Version-Release number of selected component (if applicable): libgcj-4.1.2-12 gcc-java-4.1.2-12 How reproducible: 100% Steps to Reproduce: 1. run rpmbuild -ba over the attached src.rpm and install it 2. run trang 3. Actual results: error as shown ebove Expected results: help because arguments are missing (as with results from running .jar file)
Created attachment 158415 [details] testing src.rpm
Created attachment 158422 [details] stdout/stderr of the rpmbuild process
First of all, this is built without -findirect-dispatch, plus it redefines some classes defined libgcj.so.8rh (e.g. org.relaxng.datatype.*). I believe redefinition of system classes is only possible with BC-ABI. The above error is because next_or_version field is shared for version value (before the class is registered) and for a chain pointer after it is registered. But as the binary redefines say _ZN3org7relaxng8datatype7helpers21DatatypeLibraryLoader6class$E the same class is referenced in .jcr section of libgcj.so.8rh and in .jcr section of the binary (why aren't .jcr relocations always to hidden aliases and therefore always bind to the same shared library?). That means the same class is initialized twice.
The "old" ABI (i.e. compiling without -findirect-dispatch) requires symbols to be unique in the context of an executable. Redefining classes in an application is a bug in the application. This is not a crash: libgcj detected a problem with the application and shut down.
Thanks. I'd suggest then to build this with -findirect-dispatch and additionally nuke classes that are already in libgcj, unless the overriding is intentional (I guess it is just because the codebase is extremely old).