Showing posts with label gcc. Show all posts
Showing posts with label gcc. Show all posts

Friday, July 7, 2017

GCC specs file: how to get the installation path

Leave a Comment

Instead of giving -Wl,-rpath=$HOME/local/gcc52/lib64 to each invocation of GCC 5.2 which I built from the source, I modified its spec file in this way:

*link_command: %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:    %(linker) -rpath=%:getenv(HOME /local/gcc52/lib64) ... 

But this depends on my specific installation under $HOME/local/gcc52. Are there better way to refer to the installation path of the invoked GCC itself?

This manual page did not help me much:

1 Answers

Answers 1

You can try to change the location from the directory

Read More

Wednesday, May 31, 2017

execinfo.h missing when installing xgboost in Cygwin

Leave a Comment

I've follow the following tutorial in order to install xgboost python package within Cygwin64:

https://www.ibm.com/developerworks/community/blogs/jfp/entry/Installing_XGBoost_For_Anaconda_on_Windows

But when executing the make in dmlc-core directory I get the following errors:

harrison4@mypc ~/xgboost/dmlc-core $ mingw32-make -j4 g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude  -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o line_split.o src/io/line_split.cc g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude  -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o recordio_split.o src/io/recordio_split.cc g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude  -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o input_split_base.o src/io/input_split_base.cc g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude  -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o io.o src/io.cc src/io/line_split.cc:1:0: aviso: se descarta -fPIC para el objetivo (todo el código es independiente de posición)  // Copyright by Contributors  ^ src/io.cc:1:0: aviso: se descarta -fPIC para el objetivo (todo el código es independiente de posición)  // Copyright by Contributors  ^ src/io/input_split_base.cc:1:0: aviso: se descarta -fPIC para el objetivo (todo el código es independiente de posición)  // Copyright by Contributors  ^ src/io/recordio_split.cc:1:0: aviso: se descarta -fPIC para el objetivo (todo el código es independiente de posición)  // Copyright by Contributors  ^ In file included from include/dmlc/io.h:14:0,                  from src/io/line_split.cc:2: include/dmlc/./logging.h:18:22: error fatal: execinfo.h: No such file or directory compilación terminada. Makefile:83: recipe for target 'line_split.o' failed mingw32-make: *** [line_split.o] Error 1 mingw32-make: *** Waiting for unfinished jobs.... In file included from src/io/input_split_base.cc:2:0: include/dmlc/logging.h:18:22: error fatal: execinfo.h: No such file or directory compilación terminada. In file included from include/dmlc/io.h:14:0,                  from src/io.cc:4: include/dmlc/./logging.h:18:22: error fatal: execinfo.h: No such file or directory compilación terminada. Makefile:83: recipe for target 'input_split_base.o' failed mingw32-make: *** [input_split_base.o] Error 1 Makefile:83: recipe for target 'io.o' failed mingw32-make: *** [io.o] Error 1 In file included from include/dmlc/./io.h:14:0,                  from include/dmlc/recordio.h:12,                  from src/io/recordio_split.cc:2: include/dmlc/././logging.h:18:22: error fatal: execinfo.h: No such file or directory compilación terminada. Makefile:83: recipe for target 'recordio_split.o' failed mingw32-make: *** [recordio_split.o] Error 1 

Why am I getting this error? Let me know if you need more information, please.

1 Answers

Answers 1

You can put #undef DMLC_LOG_STACK_TRACE right after it's definition on line 45 here. See example in this gist.

execinfo.h is only available on Linux, but in this project it is used only for debugging and printing stack trace on Linux. There is a check for Mingw in their codebase, don't know why it is not defined (they've disabled it, see this PR).

You should try to change those lines and run make again.

Read More

Wednesday, June 22, 2016

Error while using R through the command line

Leave a Comment

I am working on mirtCAT package in R. I need to debug inside a function in this package called mirtCAT(). There are many function inside this one which are written in c++. I need to see which function is taking which value. That is why I need to debug inside the c++ functions which I am trying to do using gdb. I am referring this document for the same:

http://r-pkgs.had.co.nz/src.html#src-debugging

When I am using the command R --debugger=gdb to start R on the command prompt

It is starting R but I think it is not starting the gcc compiler.

It is throwing the warning :

unknown option '--debugger=gdb'

I have changed my environment path variables for gcc compiler.

Any suggestions anyone have?

P.S. I also referred to this thread: Debugging (line by line) of Rcpp-generated DLL under Windows

Where @Dirk suggests to start R by using command R -d gdb

which is also not working it says::

unknown option '-d'  ARGUEMENT 'gdb' is _ignored_ 

1 Answers

Answers 1

Try :

gdb Rgui.exe (gdb) break WinMain 
Read More

Monday, April 25, 2016

Define a new type of memory

Leave a Comment

Is it possible to define a new type of memory. For example in some embedded systems compilers you can do this:

__flash const char array[] = "This is memory in flash (not ram) so I can waste it!"; 

So is it possible to go even crazier and define a new type of memory (like say an SD card).

I am basically asking is it possible to define what an SD card is (how to access data in it) and then declare a variable in the sd memory. (every where it sees a write it calls the sd method, every where it sees a read it calls the sd method):

class SDCard{ public:   void write(void* data,size_t length);   void* read(size_t length);   void* memAlloc(size_t length);  };  __sd char myVar;  //Grabs an address in the sd card based on SDCard::memAlloc myVar = 'A';  //Calls whatever I defined the sd card write operation as char other = myVar;  //Calls whatever I defined the sd card read operation as 

I am using gcc if I can do something special with that (I am almost willing to modify the compiler source to allow me to do this).

Something like this is possible, but there are a few issues:

struct Vol_t{   //Would represent an SD card an external RAM or any other memory     void write(void* data,size_t len,size_t add) const{}     void* read(size_t len,size_t add) const{} }; template<Vol_t* sd, class Type,size_t address> struct MemDef{  //Wrap your type with this (maybe add -> operator support later     void operator=(Type&& data){         sd->write(&data,sizeof(data),address);     }     operator Type&(){         return *reinterpret_cast<Type*>(sd->read(sizeof(Type),address));     } };  Vol_t SD;  //Initialize our SD card MemDef<&SD,int,0xdeadbeaf> sdVar;  //Declare an int variable on the SD card  int main(int argc,char** args){     sdVar = 12;   //Writes to the SD card     int local = sdVar;  //Reads from the SD card     system("Pause"); } 

Problems with this approach:

  • Optimizer must do every single read/write----it cannot do any optimizations on a variable declared in this way. (this is the major issue)
  • It is a little inelegant (but it does get the job done)
  • You have to specify what memory address to use (It would be awesome if the compiler could somehow figure all of that out before compilation and automatically

So maybe I have to add a keyword to gcc (if that is the case please point me in the right direction to get started).

Edit: there is another problem with this approach. If a type has a pointer to another variable that variable will not be initialized on the SD card (only the pointer will).

2 Answers

Answers 1

There could be two cases:

  1. The hardware is such that a certain range of addresses maps to the SD card, and data can be written/read from the SD card using normal memory access instructions, within that range. Regular pointers are used.
  2. Special instructions/functions need to be used to read/write to the SD card. For example an SDCard::read function, which calls a special function on the OS (if any), or an interrupt instruction.

__flash is a GCC extension. It uses a different instruction to access the memory, and locates static data on another segment. But it cannot be generalized in this way using C++ alone. It also can't be used with dynamic allocation.

First case (range of addresses)

To use regular pointers to read/write data to the SD card, they need to be marked volatile. This way the compiler does not optimize away and reads/writes. volatile means the memory may be changed/be used from outside the program, like for instance the hardware writing it to a SD card. See http://en.cppreference.com/w/cpp/language/cv .

For example

volatile char* data = 0x00010000; memcpy(data, "test", 5); 

writes "test" on the SD card, if for example the memory range 0x00010000..0x0001ffff maps to it.

To dynamically allocate memory on the SD card, like with malloc and free for regular working memory, a custom allocator would be needed. It would need to handle memory segmentation itself i.e. it needs to map which areas of the memory are free or allocated, and allocate(len) needs to find a free segment of length at least len. This is normally handled by the operating system.

This can be written in C++ as an allocator class, a class which must fulfill the requirements of Allocator (concept): http://en.cppreference.com/w/cpp/concept/Allocator . For example (incomplete):

template<typename T> class SD_allocator {     using value_type = T;     using pointer = T*;     pointer allocate(std::size_t len) {} // allocate segment of len bytes     void deallocate(pointer, std::size_t) {} }; 

If can then be used with STL containers, like:

std::vector<int, SD_allocator<int>> vec; 

uses the memory on the SD card for the items of vec. Here they are non-volatile, and for meant for use inside the program only, not for persistent storage on the SD card.

The standard allocator in C++ is std::allocator, which allocates regular memory like malloc and free.

Boost seems to provide an allocator which handles segmentation, on a custom defined memory region:

http://www.boost.org/doc/libs/1_35_0/doc/html/interprocess/managed_memory_segments.html http://www.boost.org/doc/libs/1_55_0/doc/html/boost/interprocess/allocator.html

For persistent storage, such as an SD card, it may be better to define a fixed structure and layout for the data on the SD card, and then read/write to it.

struct SDCard_data {     std::int32_t int1;     std::int32_t buffer1[500];     std::int8_t padding_[34];     int four_bit1 : 4;     int four_bit2 : 4;     bool bit1:1;     bool bit2:1;     bool bit3:1;     bool bit4:1; };  static volatile SDCard_data* sdcard     = reinterpret_cast<volatile SDCard_data*>(0x0001000);  int write_to_card() {     // writes to the card     card->int1 = 32;     card->bit3 = true; } 

Second case (special instructions)

If reads/writes to the SD card do not correspond to regular memory access instructions on the hardware, data on it cannot be accessed directly using raw volatile pointers.

If the goal is to still access it in that way, a class such as MemDef would be needed. It may be better to treat the SD card like a file/stream, and instead write/read whole chunks of data to/from it, using functions like fopen, fread, fprintf or similar.

Objects need to be serialized/unserialized for this. Copying a struct as raw memory, like

struct A; A a; write_to_card(reinterpret_cast<void*>(&a), sizeof(A)) 

works as long as the struct is a PODType and does not contain any pointers/references, i.e. types whose internal representation depends on the memory addresses. It is also dependent on the platform's memory layout (alignment, struct padding), endianness, representation of float, CHAR_BIT, etc. For cross-platform support (e.g. when the SD-card is read from another device with another microcontroller, some file format would need to be used instead.

It may also be possible (but difficult) to define a custom Allocator class, which uses a class like MemDef as pointer type.

Answers 2

Well, in C++ world in order to abstract memory usually you write a custom allocator. Along the lines

template <class T> class SDAlloc {  public:    typedef T        value_type;    typedef T*       pointer;    typedef const T* const_pointer;    typedef T&       reference;    typedef const T& const_reference;    typedef std::size_t    size_type;    typedef std::ptrdiff_t difference_type;     // rebind allocator to type U    template <class U>    struct rebind {        typedef SDAlloc<U> other;    };     // return address of values    pointer address (reference value) const {        return &value;    }    const_pointer address (const_reference value) const {        return &value;    }     SDAlloc(const char* device) {        // open device by name        // make helper structures    }    ~SDAlloc() {        // close device    }     // return maximum number of elements that can be allocated    size_type max_size () const throw() {        return SDsize;    }     // allocate but don't initialize num elements of type T    pointer allocate (size_type num, const void* = 0) {        // print message and allocate memory on SD    }     ....... 
Read More

Sunday, April 24, 2016

Get the commands distutils passes to the compiler

Leave a Comment

Lets say I have this Python code in a setup.py script to build a C extension:

from distutils.core import setup, Extension  module1 = Extension('demo', sources = ['demo.c'])  setup (name = 'PackageName',        version = '1.0',        description = 'This is a demo package',        ext_modules = [module1]) 

Easy enough. Now I call the setup.py script with this line:

C:/> python setup.py build_ext --compiler=mingw32 

Ok, but whats the question?

When distutils calls mingw32 and passes all the necessary and operating system independant flags and options to it, how does it figure those flags out?

Where does distutils keep the commands related to each platform, and how can I access them?

1 Answers

Answers 1

It's not as simple as a set of options but you can see how it works. In your python source directory look for this

distutils/ccompiler.py 

In that file each compiler has an entry like this

# Map compiler types to (module_name, class_name) pairs -- ie. where to # find the code that implements an interface to this compiler.  (The module # is assumed to be in the 'distutils' package.) compiler_class = { 'unix':    ('unixccompiler', 'UnixCCompiler',                                "standard UNIX-style compiler"),                    'msvc':    ('msvccompiler', 'MSVCCompiler',                                "Microsoft Visual C++"),                    'cygwin':  ('cygwinccompiler', 'CygwinCCompiler',                                "Cygwin port of GNU C Compiler for Win32"),                    'mingw32': ('cygwinccompiler', 'Mingw32CCompiler',                                "Mingw32 port of GNU C Compiler for Win32"),                    'bcpp':    ('bcppcompiler', 'BCPPCompiler',                                "Borland C++ Compiler"),                    'emx':     ('emxccompiler', 'EMXCCompiler',                                "EMX port of GNU C Compiler for OS/2"),                  }     

You can find the code you're looking for in

distutils/cygwinccompiler.py 

If you edit your setup.py script and add this

from distutils.core import setup,Extension from distutils.cygwinccompiler import Mingw32CCompiler from pprint import pprint  module1 = Extension('demo', sources = ['demo.c'])  m32 = Mingw32CCompiler() pprint (vars(m32))   setup (name = 'PackageName',    version = '1.0',    description = 'This is a demo package',    ext_modules = [module1]) 

You can see quite a few of the options available...

{'archiver': ['ar', '-cr'],  'compiler': ['gcc', '-O', '-Wall'],  'compiler_cxx': ['g++', '-O', '-Wall'],  'compiler_so': ['gcc', '-mdll', '-O', '-Wall'],  'dll_libraries': None,  'dllwrap_version': None,  'dry_run': 0,  'force': 0,  'gcc_version': LooseVersion ('4.2.1'),  'include_dirs': [],  'ld_version': None,  'libraries': [],  'library_dirs': [],  'linker_dll': 'dllwrap',  'linker_exe': ['gcc'],  'linker_so': ['dllwrap', '-mdll', '-static'],  'macros': [],  'objects': [],  'output_dir': None,  'preprocessor': None,  'ranlib': ['ranlib'],  'runtime_library_dirs': [],  'verbose': 0} 

To access individual options you can use them as follows...

print m32.compile ['gcc', '-O', '-Wall'] 

There's no simple set of flags. A lot of the flags are configured at runtime and the code above shows you were to look to see how they're generated etc.

Read More

Friday, March 18, 2016

Export Makers, Symbol Visibility, …?

Leave a Comment

I am trying to develop a library which has to be platform independent. While writing library API, it is a good practice making some prefixes for the functions with the some preprocessor defines.

For example, Windows API has WINAPI, OpenMPI has OMPI_DECLSPEC and so on...

OpenMPI:

OMPI_DECLSPEC  int MPI_Init(int *argc, char ***argv); 

OpenGL:

GLAPI void GLAPIENTRY glBegin( GLenum mode ); 

With this preprocessor defines, programmers can set export options, visibilities, calling conventions for functions in the library. At OpenGL function declarations, as you can see, there are two different preprocessor defines.

What is the name of this prefix in the literature?

Edit: https://gcc.gnu.org/wiki/Visibility in this page, the topic is discussed. I think, this kind of macros deserves a special name. We could name it as "visibility macro" or something, but this macro can set other kind of things according to compiler, OS, etc...

2 Answers

Answers 1

What is the name of this prefix in the literature?

They are called macros. They facilitate conditional compilation in the C and C++ languages. They were also used as substitute for typedefs back in the days. Take GLAPIENTRY for instance, it's defined thus:

#define GLAPIENTRY __stdcall 

If the author has to change the calling convention to __cdecl, if __stdcall was directly put in the function declaration, then for every function this has to be changed. However, with the macro, just redefining would do:

#define GLAPIENTRY __cdecl 

Answers 2

As far as I know there isn't a specific name for these types of macros, but if I were to have to give these a name, I would have to label them "context macros" or (more specific to functions) "function attribute portability context macros" since they are typically defined based on the context of the compilation unit.

This could be further split into additional categories:

  • Portability macros for example:
    • __attribute__() vs. __declspec()
    • __attribute__((always_inline)) vs. __forceinline
    • or defining unsupported attributes as empty
  • Compilation context macros
    • static vs extern
    • visibility context macros (hidden, default, protected, internal/symbolic,...)

Portability context macros are used to overcome the differences between compilers and/or host/target architectures and operating systems. These cover more than just differences between visibility (including any special function attributes)

Compilation context macros can allow the same source to be used for effeciently compiling for different types of compilation such as a static vs PIC and library vs. binary. These may include various inline or visibility directives depending on the compilation context.

In the example given

GLAPI void GLAPIENTRY glBegin( GLenum mode ); 

The GLAPI would represent a compilation context (probably also with associated portability macros) and the GLAPIENTRY is just a portability macro wrapper for a specific set of function attributes (it is a "cross-platform" API).

Read More

Friday, March 11, 2016

Unable to build a working FIPS capable OpenSSL on HP-UX

1 comment

I am building openssl-1.0.2f with openssl-fips-2.0.12 (I am going to talk about this configuration in the following lines, but at the end of the post I'll specify all the configurations that I tried), on HP-UX11.31(pa-risc2). Everything is good, but when I try using it (in FIPS mode), it doesn't work.

Note: Given the fact that cwd is set to the build folder (not the installation folder where RPATH points to), I need to instruct the linker where to search for libs (SHLIB_PATH):

[%__OPENSSL_MACHINE_PROMPT%]> OPENSSL_FIPS=1 SHLIB_PATH=./lib ./bin/openssl version -a

2063867464:error:2D06B071:FIPS routines:FIPS_check_incore_fingerprint:fingerprint does not match segment aliasing:fips.c:224:

Note: Instead of displaying any path, I'm replacing it by a meaningful placeholder (name starting with __OPENSSL) surrounded by % signs (the equivalent of Win env vars - don't want to create confusion if any possible UX env vars might be involved).

Here's the output of the "same" command without setting FIPS (OPENSSL_FIPS=1) mode:

[%__OPENSSL_MACHINE_PROMPT%]> SHLIB_PATH=./lib ./bin/openssl version -a

OpenSSL 1.0.2f-fips 28 Jan 2016 built on: Fri Feb 26 09:53:34 2016 platform: hpux-parisc2-gcc options: bn(64,64) rc4(ptr,char) des(ptr,risc1,16,long) blowfish(idx) compiler: gcc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -DDSO_DL -fPIC -D_REENTRANT -march=2.0 -O3 -DB_ENDIAN -D_REENTRANT -I%__OPENSSL_BUILD_PATH%/include OPENSSLDIR: "%__OPENSSL_PREFIX_DIR%"

This occurs on all the machines I've tried running it (including the very machine I've built it on):

[%__OPENSSL_BUILD_MACHINE_PROMPT%]> uname -a

HP-UX hpux1131 B.11.31 U 9000/800 629887774 unlimited-user license

gcc version (native linker (ld_pa) used):

[%__OPENSSL_BUILD_MACHINE_PROMPT%]> gcc -v

Using built-in specs. Target: hppa2.0w-hp-hpux11.31 Configured with: ../gcc-4.2.4/configure --disable-shared --with-gnu-as --with-as=%__GCC_PREFIX_PATH%/bin/as --with-ld=/bin/ld --disable-nls --enable-threads=posix --prefix=%__GCC_PREFIX_PATH% --with-local-prefix=%__GCC_PREFIX_PATH% Thread model: posix gcc version 4.2.4

  • Here's the openssl-fips-2.1.12 configurator's output:

./config no-asm

Operating system: 9000/800-hp-hpux1x Auto Configuring fipsonly Auto Configuring fipsonly Configuring for hpux-parisc2-gcc Auto Configuring fipsonly Configuring for hpux-parisc2-gcc no-asm [option] OPENSSL_NO_ASM no-bf [option] OPENSSL_NO_BF (skip dir) no-camellia [option] OPENSSL_NO_CAMELLIA (skip dir) no-cast [option] OPENSSL_NO_CAST (skip dir) no-ec_nistp_64_gcc_128 [default] OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir) no-gmp [default] OPENSSL_NO_GMP (skip dir) no-idea [option] OPENSSL_NO_IDEA (skip dir) no-jpake [experimental] OPENSSL_NO_JPAKE (skip dir) no-krb5 [krb5-flavor not specified] OPENSSL_NO_KRB5 no-md2 [option] OPENSSL_NO_MD2 (skip dir) no-md5 [option] OPENSSL_NO_MD5 (skip dir) no-mdc2 [option] OPENSSL_NO_MDC2 (skip dir) no-rc2 [option] OPENSSL_NO_RC2 (skip dir) no-rc4 [option] OPENSSL_NO_RC4 (skip dir) no-rc5 [option] OPENSSL_NO_RC5 (skip dir) no-rfc3779 [default] OPENSSL_NO_RFC3779 (skip dir) no-ripemd [option] OPENSSL_NO_RIPEMD (skip dir) no-seed [option] OPENSSL_NO_SEED (skip dir) no-srp [forced] OPENSSL_NO_SRP (skip dir) no-ssl2 [forced] OPENSSL_NO_SSL2 (skip dir) no-ssl3 [forced] OPENSSL_NO_SSL3 (skip dir) no-store [experimental] OPENSSL_NO_STORE (skip dir) no-tls1 [forced] OPENSSL_NO_TLS1 (skip dir) no-tlsext [forced] OPENSSL_NO_TLSEXT (skip dir) no-zlib [default] no-zlib-dynamic [default]

  • And here's openssl-1.0.2f's:

./config fips shared --prefix=%__OPENSSL_PREFIX_DIR% no-rc5 no-mdc2 no-idea -fPIC no-asm --openssldir=%__OPENSSL_PREFIX_DIR%/openssl

Operating system: 9000/800-hp-hpux1x Configuring for hpux-parisc2-gcc Configuring for hpux-parisc2-gcc no-asm [option] OPENSSL_NO_ASM no-ec_nistp_64_gcc_128 [default] OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir) no-gmp [default] OPENSSL_NO_GMP (skip dir) no-idea [option] OPENSSL_NO_IDEA (skip dir) no-jpake [experimental] OPENSSL_NO_JPAKE (skip dir) no-krb5 [krb5-flavor not specified] OPENSSL_NO_KRB5 no-libunbound [experimental] OPENSSL_NO_LIBUNBOUND (skip dir) no-md2 [default] OPENSSL_NO_MD2 (skip dir) no-mdc2 [option] OPENSSL_NO_MDC2 (skip dir) no-rc5 [option] OPENSSL_NO_RC5 (skip dir) no-rfc3779 [default] OPENSSL_NO_RFC3779 (skip dir) no-rsax [forced] OPENSSL_NO_RSAX (skip dir) no-sctp [default] OPENSSL_NO_SCTP (skip dir) no-ssl-trace [default] OPENSSL_NO_SSL_TRACE (skip dir) no-store [experimental] OPENSSL_NO_STORE (skip dir) no-unit-test [default] OPENSSL_NO_UNIT_TEST (skip dir) no-zlib [default] no-zlib-dynamic [default]

Important note: I've stated the problem that I have using openssl-1.0.2f + openssl-fips-2.0.12 on HP-UX11.31 om PA-RISC2. What else I've tried:

  • openssl-1.0.1X (where X = [e..p]) + openssl-fips-2.0.5
  • HP-UX11.31 or HP-UX11.11 on PA-RISC2
  • HP-UX11.11 on IA64
  • no-asm configure flag specified/unspecified

Note: During debug, I've also modified fips_premain.c (and others), and (shocking :) ), the fingerprint produced by fips_premain_dso (compiled with -DFINGERPRINT_PREMAIN_DSO_LOAD) and the one computed at runtime don't match! I've also dumped the memory zone (in original or hex format) that the fingerprint is being computed on, and (of course) it differs (but so for I can't tell why).

Given the fact that it works (or it is supposed to work) - even if not being tested on pa-risc, but only on IA64 -, and extensive Google search didn't reveal anything truly relevant, I am 99.99 sure that it is related to the machine(s) in my environment.

However, can anyone give me some pointers?

0 Answers

Read More