[cfe-dev] Why clang may not be compatible with gcc for .a file generation?

Peng Yu via cfe-dev cfe-dev at lists.llvm.org
Wed Jan 23 19:00:20 PST 2019


Hi,

I have the following trace.c file compiled with the following command
with clang.

$ clang -Wall -pedantic -c -o trace.o trace.c
$ ar cr  libtrace.a trace.o
$ ranlib libtrace.a

Then, I run configure from a GNU package, which gives the following
error. It asks to recompile the .a with -fPIC. Is it because gcc and
clang has different default on whether -fPIC is enabled? Could anybody
help explain why there is such a difference? Thanks.

configure:3772: gcc -g -finstrument-functions
-L/root/linux/bin/wrappercomposite/src/xplat/llvmxplat/src/mkvar/bin/Linux
conftest.c -ltrace >&5
/usr/bin/ld: /root/linux/bin/wrappercomposite/src/xplat/llvmxplat/src/mkvar/bin/Linux/libtrace.a(trace.o):
relocation R_X86_64_32S against `.bss' can not be used when making a
PIE object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output

//trace.c
#include <stdio.h>
#include <stdlib.h>
//#include <time.h>

static FILE *fp_trace;

void __attribute__ ((constructor)) trace_begin (void) {
    const char *s=getenv("TRACE_OUTFILE");
    if(s) {
        fp_trace = fopen(s, "w");
    } else {
        fputs(
                "\x1b[31;1mThe environment variable TRACE_OUTFILE must
be set.\x1b[m\n"
                , stderr
                );
        exit(1);
    }
}

void __attribute__ ((destructor)) trace_end (void) {
    if(fp_trace != NULL) {
        fclose(fp_trace);
    }
}

void __cyg_profile_func_enter (void *func,  void *caller) {
    if(fp_trace != NULL) {
        //fprintf(fp_trace, "e %p %p %lu\n", func, caller, time(NULL) );
        fprintf(fp_trace, "%p\t%p\n", func, caller);
    }
}

void __cyg_profile_func_exit (void *func, void *caller) { }


-- 
Regards,
Peng


More information about the cfe-dev mailing list