lvc / abi-compliance-checker

A tool for checking backward API/ABI compatibility of a C/C++ library
https://lvc.github.io/abi-compliance-checker/
GNU Lesser General Public License v2.1
627 stars 78 forks source link

illumos/Solaris support #47

Open pyhalov opened 8 years ago

pyhalov commented 8 years ago

Are there any chance to see illumos support in the checker? Binutils are available here, however, using elfdump could be more preferable.

lvc commented 8 years ago

Possible.

Does abi-compliance-checker --test work on illumos?

Please post errors here if any.

Thank you.

pyhalov commented 8 years ago
$ abi-compliance-checker --test
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)

verifying detectable C library changes
ERROR: can't compile libsample_c v.1: 'libsample_c/libsample.v1/build-log.txt'

$ cat libsample_c/libsample.v1/build-log.txt 
libsample.c: In function 'returnTypeBecameConst':
libsample.c:13:64: warning: incompatible implicit declaration of built-in function 'malloc'
         char* returnTypeBecameConst(int param) { return (char*)malloc(256); }
                                                                ^
libsample.c: In function 'returnTypeBecameConst2':
libsample.c:14:65: warning: incompatible implicit declaration of built-in function 'malloc'
         char* returnTypeBecameConst2(int param) { return (char*)malloc(256); }
                                                                 ^
libsample.c: In function 'returnTypeBecameConst3':
libsample.c:15:65: warning: incompatible implicit declaration of built-in function 'malloc'
         char* returnTypeBecameConst3(int param) { return (char*)malloc(256); }
                                                                 ^
libsample.c: In function 'returnTypeBecameVolatile':
libsample.c:16:67: warning: incompatible implicit declaration of built-in function 'malloc'
         char* returnTypeBecameVolatile(int param) { return (char*)malloc(256); }
                                                                   ^
Text relocation remains                         referenced
    against symbol                  offset      in file
.rodata.cst4 (section)              0x1bb       /var/tmp//ccc8aqmW.o
.rodata.cst4 (section)              0x1f5       /var/tmp//ccc8aqmW.o
.rodata.cst4 (section)              0x226       /var/tmp//ccc8aqmW.o
malloc                              0x28        /var/tmp//ccc8aqmW.o
malloc                              0x3d        /var/tmp//ccc8aqmW.o
malloc                              0x52        /var/tmp//ccc8aqmW.o
malloc                              0x67        /var/tmp//ccc8aqmW.o
ld: fatal: relocations remain against allocatable but non-writable sections
collect2: error: ld returned 1 exit status

I don't see -fPIC -DPIC in Makefile:

$ cat Makefile 
all:
        gcc -shared libsample.c -o libsample.so -g -Og
test:
        gcc test.c -Wl,libsample.so -o test
clean:
        rm test libsample.so
pyhalov commented 8 years ago

If I add these options to /usr/share/abi-compliance-checker/modules/Internals/RegTests.pm , I see $ abi-compliance-checker --testUsing GCC 4.9.4 (i386-pc-solaris2.11, target: x86)

verifying detectable C library changes preparation, please wait ... Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86) ERROR: Not implemented yet ERROR: analysis has failed

lvc commented 8 years ago

Please check the commit 9c87bdb91c373e11e9cf218122e245387e66530f. Do you have any objdump in the system?

Also please consider using https://github.com/lvc/abi-dumper (makes use of eu-readelf from Elfutils) utility to extract ABI dumps from debug-info of compared objects and then compare them by abi-compliance-checker.

Thank you.

pyhalov commented 8 years ago

Looks better. I have binutils.

$ abi-compliance-checker --test
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)

verifying detectable C library changes
preparation, please wait ...
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)
checking header(s) 1.0 ...
ERROR: some errors occurred when compiling headers
ERROR: see log for details:
  /export/home/alp/tmp/logs/libsample_c/1.0/log.txt

checking header(s) 2.0 ...
ERROR: some errors occurred when compiling headers
ERROR: see log for details:
  /export/home/alp/tmp/logs/libsample_c/2.0/log.txt

comparing ABIs ...
comparing APIs ...
creating compatibility report ...
result: INCOMPATIBLE (Binary: 52.3%, Source: 23%)
total "Binary" compatibility problems: 86, warnings: 49
total "Source" compatibility problems: 36, warnings: 52
see detailed report:
  compat_reports/libsample_c/1.0_to_2.0/compat_report.html
ERROR: analysis has failed

In logs/libsample_c/1.0/log.txt I see:

  // add includes
  #include "/export/home/alp/tmp/libsample_c/libsample.v1/libsample.h"

The GCC parameters:
  gcc -fdump-translation-unit -fkeep-inline-functions -c -x c++-header -fpermissive -w "/tmp/g0w9Uwlb66/dump1.h"  -I/export/home/alp/tmp/libsample_c/libsample.v1

In file included from /tmp/g0w9Uwlb66/dump1.h:3:0:
/export/home/alp/tmp/libsample_c/libsample.v1/libsample.h:340:31: error: expected primary-expression before ‘int’
          int testCppKeywords1(int class, int virtual, int (*new)(int));
                               ^
/export/home/alp/tmp/libsample_c/libsample.v1/libsample.h:340:42: error: expected primary-expression before ‘int’
          int testCppKeywords1(int class, int virtual, int (*new)(int));
                                          ^
/export/home/alp/tmp/libsample_c/libsample.v1/libsample.h:340:55: error: expected primary-expression before ‘int’
          int testCppKeywords1(int class, int virtual, int (*new)(int));

In logs/libsample_c/2.0/log.txt:

The GCC parameters:
  gcc -fdump-translation-unit -fkeep-inline-functions -c -x c++-header -fpermissive -w "/tmp/g0w9Uwlb66/dump2.h"  -I/export/home/alp/tmp/libsample_c/libsample.v2

In file included from /tmp/g0w9Uwlb66/dump2.h:3:0:
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:352:31: error: expected primary-expression before ‘int’
          int testCppKeywords1(int class, int virtual);
                               ^
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:352:42: error: expected primary-expression before ‘int’
          int testCppKeywords1(int class, int virtual);
                                          ^
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:353:43: error: declaration of ‘operator,’ as non-function
          int testCppKeywords2(int operator, int other);
                                           ^
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:353:45: error: expected ‘)’ before ‘int’
          int testCppKeywords2(int operator, int other);
                                             ^
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:353:45: error: expected initializer before ‘int’
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:354:35: error: expected ‘)’ before ‘operator’
          int testCppKeywords3(int operator);
                                   ^
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:354:35: error: expected initializer before ‘operator’
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:355:22: error: expected type-specifier before ‘(’ token
          int operator(int class, int this);
                      ^
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:356:14: error: expected unqualified-id before ‘delete’
          int delete(int virtual, int* this);
              ^
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:358:23: error: two or more data types in declaration of ‘type name’
             int bool: 8;
                       ^
/export/home/alp/tmp/libsample_c/libsample.v2/libsample.h:366:22: error: expected unqualified-id before ‘delete’
                 void delete() {

Report itself can be seen here: http://buildzone.oi-build.r61.net/compat/compat_report.html Will check on some real library a bit later.

lvc commented 8 years ago

Hello,

Thank you for quick response. I've improved support for Solaris in 31007a47094495e4e63edc5a226241ca3811701d. Also added -fPIC -DPIC options to compile tests. Please update and try -test again. The tool should run both C and C++ tests this time.

Thank you.

pyhalov commented 8 years ago

Hello. Seems to be even better (now I patched it to use exuberant-ctags):

--- abi-compliance-checker-31007a47094495e4e63edc5a226241ca3811701d/abi-compliance-checker.pl   2016-10-26 12:35:37.000000000 +0300
+++ abi-compliance-checker-31007a47094495e4e63edc5a226241ca3811701d/abi-compliance-checker.pl     2016-10-26 23:05:49.408976703 +0300
@@ -8170,6 +8170,13 @@
             printMsg("WARNING", "can't find \'ectags\' program");
         }
     }
+    if($OSgroup eq "solaris")
+    { # use exuberant-ctags on OI
+       $CTags = get_CmdPath("exuberant-ctags");
+        if(not $CTags) {
+            printMsg("WARNING", "can't find \'exuberant-ctags\' program");
+        }
+    }
     if(not $CTags) {
         $CTags = get_CmdPath("ctags");
     }

Unfortunately, it's highly OpenIndiana-specific (we have at least 4 different ctag executables). The output now is:

$ abi-compliance-checker --test
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)

verifying detectable C library changes
preparation, please wait ...
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)
checking header(s) 1.0 ...
Checking the code for C++ keywords
Using C++ compatibility mode
checking header(s) 2.0 ...
Checking the code for C++ keywords
Using C++ compatibility mode
comparing ABIs ...
comparing APIs ...
creating compatibility report ...
result: INCOMPATIBLE (Binary: 51.7%, Source: 23.9%)
total "Binary" compatibility problems: 86, warnings: 51
total "Source" compatibility problems: 38, warnings: 52
see detailed report:
  compat_reports/libsample_c/1.0_to_2.0/compat_report.html
result: SUCCESS (124 problems found)

verifying detectable C++ library changes
preparation, please wait ...
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)
checking header(s) 1.0 ...
checking header(s) 2.0 ...
comparing ABIs ...
comparing APIs ...
creating compatibility report ...
result: INCOMPATIBLE (Binary: 49.3%, Source: 23.9%)
total "Binary" compatibility problems: 140, warnings: 68
total "Source" compatibility problems: 78, warnings: 45
see detailed report:
  compat_reports/libsample_cpp/1.0_to_2.0/compat_report.html
result: SUCCESS (218 problems found)

Reports can be found here: http://buildzone.oi-build.r61.net/compat/compat_reports/

pyhalov commented 8 years ago

Now I've tried on libXfont (update from 1.4.9 to 1.5.2), I know it's incompatible, as some symbols were removed. Unfortunately, abi-compliance-checker didn't detect it.

$ cat NEW.xml 
<version>
1.5.2
</version>
<headers>
/export/home/alp/srcs/tests/oi-userland/components/x11/libXfont/build/prototype/i386/usr/include
</headers>
<include_paths>
    /usr/include/xorg
</include_paths>
<libs>
/export/home/alp/srcs/tests/oi-userland/components/x11/libXfont/build/prototype/i386/usr/lib/xorg
</libs>

$ cat OLD.xml
cat OLD.xml 
<version>
1.4.9
</version>
<headers>
/export/home/alp/srcs/oi-userland/components/x11/libXfont/build/prototype/i386/usr/include
</headers>
<include_paths>
    /usr/include/xorg
</include_paths>
<libs>
/export/home/alp/srcs/oi-userland/components/x11/libXfont/build/prototype/i386/usr/lib/xorg
</libs>
$ objdump -t ~/srcs/oi-userland/components/x11/libXfont/build/prototype/i386/usr/lib/xorg/libXfont.so|grep SnfSetFormat
00026730 g     F .text  0000003e              SnfSetFormat
$ objdump -t ~/srcs/tests/oi-userland/components/x11/libXfont/build/prototype/i386/usr/lib/xorg/libXfont.so|grep SnfSetFormat
# nothing here

From logs/Xfont/1.4.9/log.txt and logs/Xfont/1.5.3/log.txt I see that sample program compilation failed, as not all symbols in include files were found. As for report itself, it shows verdict compatible: http://buildzone.oi-build.r61.net/lXfont.html

lvc commented 8 years ago

Alexander,

Please run this case with additional -test-dump -debug options and share somewhere archive with ./debug/ and ./abi_dumps/ directories for debugging what is going wrong.

Thank you.

pyhalov commented 8 years ago
$ abi-compliance-checker -test-dump -debug
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)

verifying detectable C library changes
executing perl /usr/bin/abi-compliance-checker -l libsample_c -old libsample_c/v1.xml -new libsample_c/v2.xml -cxx-incompatible -lang C -use-dumps -debug
preparation, please wait ...
running perl /usr/bin/abi-compliance-checker -dump libsample_c/v1.xml -l libsample_c -lang C -debug
running perl /usr/bin/abi-compliance-checker -dump libsample_c/v2.xml -l libsample_c -lang C -debug
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)
checking header(s) 2.0 ...
checking header(s) 1.0 ...
ERROR: some errors occurred when compiling headers
ERROR: see log for details:
  /export/home/alp/tmp/1/logs/libsample_c/2.0/log.txt

ERROR: some errors occurred when compiling headers
ERROR: see log for details:
  /export/home/alp/tmp/1/logs/libsample_c/1.0/log.txt

creating library ABI dump ...
creating library ABI dump ...
dump path: abi_dumps/libsample_c/libsample_c_1.0.abi.tar.gz
dump path: abi_dumps/libsample_c/libsample_c_2.0.abi.tar.gz
running perl /usr/bin/abi-compliance-checker -l libsample_c -d1 abi_dumps/libsample_c/libsample_c_1.0.abi.tar.gz -d2 abi_dumps/libsample_c/libsample_c_2.0.abi.tar.gz -logging-mode a -debug
preparation, please wait ...
comparing ABIs ...
comparing APIs ...
creating compatibility report ...
result: INCOMPATIBLE (Binary: 51.1%, Source: 23.3%)
total "Binary" compatibility problems: 85, warnings: 51
total "Source" compatibility problems: 37, warnings: 52
see detailed report:
  compat_reports/libsample_c/1.0_to_2.0/compat_report.html
result: SUCCESS (122 problems found)

verifying detectable C++ library changes
executing perl /usr/bin/abi-compliance-checker -l libsample_cpp -old libsample_cpp/v1.xml -new libsample_cpp/v2.xml -lang C++ -use-dumps -debug
preparation, please wait ...
running perl /usr/bin/abi-compliance-checker -dump libsample_cpp/v1.xml -l libsample_cpp -lang C++ -debug
running perl /usr/bin/abi-compliance-checker -dump libsample_cpp/v2.xml -l libsample_cpp -lang C++ -debug
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)
Using GCC 4.9.4 (i386-pc-solaris2.11, target: x86)
checking header(s) 2.0 ...
checking header(s) 1.0 ...
creating library ABI dump ...
creating library ABI dump ...
dump path: abi_dumps/libsample_cpp/libsample_cpp_1.0.abi.tar.gz
dump path: abi_dumps/libsample_cpp/libsample_cpp_2.0.abi.tar.gz
running perl /usr/bin/abi-compliance-checker -l libsample_cpp -d1 abi_dumps/libsample_cpp/libsample_cpp_1.0.abi.tar.gz -d2 abi_dumps/libsample_cpp/libsample_cpp_2.0.abi.tar.gz -logging-mode a -debug
preparation, please wait ...
comparing ABIs ...
comparing APIs ...
creating compatibility report ...
result: INCOMPATIBLE (Binary: 49.3%, Source: 23.9%)
total "Binary" compatibility problems: 138, warnings: 66
total "Source" compatibility problems: 78, warnings: 45
see detailed report:
  compat_reports/libsample_cpp/1.0_to_2.0/compat_report.html
result: SUCCESS (216 problems found)

Tar file with debug and and abi_dumps directories is here: http://buildzone.oi-build.r61.net/compat/debug-abi.tar.gz Or do you mean there's a way to run Xfont case with abi dump debug?

pyhalov commented 8 years ago

Xfont case debug is here: http://buildzone.oi-build.r61.net/compat/Xfont-debug.tar

lvc commented 8 years ago

Alexander,

Thanks for debug info.

Looks like some symbols (including SnfSetFormat) are not included to the translation unit dump due to compilation errors. It's necessary to provide the following options of the XML descriptor to fix all the errors:

<include_preamble>
... (list of headers that should be included before others, one per line)
</include_preamble>

<gcc_options>
... (list of necessary GCC options, one per line)
</gcc_options>

<include_paths>
... (list of necessary include paths if the tool generated incorrect ones, one per line)
</include_paths>

<skip_headers>
... (list of headers to skip, one per line)
</skip_headers>

This is a drawback of the approach relative to the analysis of DWARF debug-info in shared objects (see https://github.com/lvc/abi-dumper). But this approach allows to check 100% of source compatibility rules and also allows to analyze libraries with closed source.

Thank you.