🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Christopher Hylands Sun, 31 Dec 1995 00:00
gcc-2.7.2, hpux-10.01: -shared can't build shared libraries
#6268
Author: Christopher Hylands
Date: Sun, 31 Dec 1995 00:00
125 lines
6233 bytes
When I try to create a shared library under HPUX10.01 and gcc-2.7.2,
I get the message:

/usr/bin/ld: DP-Relative Code in file /var/tmp/cca04159.o - Shared Library must be Position-Independent 

I believe that the problem is with collect, where the .o file that
collect builds is not being built with -fpic or -fPIC.

Here's how to reproduce this bug.

Create a trivial file:

cxh@hewlett 21% echo "int f() { return 1;}" > fn.c

Create a .o file with -fPIC

cxh@hewlett 22% gcc -fPIC -v -c fn.c
Reading specs from /users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2/specs
gcc version 2.7.2
 /users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2/cpp -lang-c -v -undef -D__GNUC__=2 -D__GNUC_MINOR__=7 -Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -DPWB -Dhpux -Dunix -D_HPUX_SOURCE -D__hppa__ -D__hp9000s800__ -D__hp9000s800 -D__hp9k8__ -D__PWB__ -D__hpux__ -D__unix__ -D_HPUX_SOURCE -D__hppa -D__hp9000s800 -D__hp9k8 -D__PWB -D__hpux -D__unix -Asystem(unix) -Asystem(hpux) -Acpu(hppa) -Amachine(hppa) -D__hp9000s700 -D_PA_RISC1_1 fn.c /tmp/cca04211.i
GNU CPP version 2.7.2 (hppa)
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /users/ptdesign/gnu/hppa/hppa1.1-hp-hpux10.01/include
 /users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2/include
 /usr/include
End of search list.
 /users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2/cc1 /tmp/cca04211.i -quiet -dumpbase fn.c -version -fPIC -o /tmp/cca04211.s
GNU C version 2.7.2 (hppa) compiled by GNU C version 2.7.2.
 /users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2/as -o fn.o /tmp/cca04211.s

Try to create a shared library:

cxh@hewlett 23% gcc -v -shared -Wl,-debug -o /tmp/libfn.sl fn.o
Reading specs from /users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2/specs
gcc version 2.7.2
 /users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2/ld -b -o /tmp/libfn.sl -L/users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2 -L/users/ptdesign/gnu/hppa/lib -debug fn.o
collect2 version 2.7.2 (hppa)
ld_file_name        = /usr/bin/ld
c_file_name         = /users/ptdesign/bin.hppa/gcc
nm_file_name        = /usr/sww/bin/gnm
ldd_file_name       = /usr/bin/chatr
strip_file_name     = /usr/sww/bin/gstrip
c_file              = /tmp/cca04216.c
o_file              = /tmp/cca04216.o
COLLECT_NAMES       = /users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2/ld
COLLECT_GCC_OPTIONS = -v -shared -o /tmp/libfn.sl
COLLECT_GCC         = gcc
COMPILER_PATH       = /users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2/:/users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/:/usr/lib/gcc/hppa1.1-hp-hpux10.01/2.7.2/:/usr/lib/gcc/hppa1.1-hp-hpux10.01/:/users/ptdesign/gnu/hppa/hppa1.1-hp-hpux10.01/bin/hppa1.1-hp-hpux10.01/2.7.2/:/users/ptdesign/gnu/hppa/hppa1.1-hp-hpux10.01/bin/
LIBRARY_PATH        = /users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2/:/usr/lib/gcc/hppa1.1-hp-hpux10.01/2.7.2/:/users/ptdesign/gnu/hppa/hppa1.1-hp-hpux10.01/lib/hppa1.1-hp-hpux10.01/2.7.2/:/users/ptdesign/gnu/hppa/hppa1.1-hp-hpux10.01/lib/:/users/ptdesign/gnu/hppa/lib/hppa1.1-hp-hpux10.01/2.7.2/:/users/ptdesign/gnu/hppa/lib/:/lib/hppa1.1-hp-hpux10.01/2.7.2/:/lib/:/usr/lib/hppa1.1-hp-hpux10.01/2.7.2/:/usr/lib/

/usr/bin/ld -b -o /tmp/libfn.sl -L/users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2 -L/users/ptdesign/gnu/hppa/lib fn.o
 /usr/sww/bin/gnm -p /tmp/libfn.sl

nm output with constructors/destructors.

 /usr/bin/chatr /tmp/libfn.sl

ldd output with constructors/destructors.

0 constructor(s) found
0 destructor(s)  found
[Leaving /tmp/libfn.sl]

write_c_file - output name is /tmp/libfn.sl, prefix is libfn_sl

========== output_file = /tmp/libfn.sl, c_file = /tmp/cca04216.c

write_c_file - output name is /tmp/libfn.sl, prefix is libfn_sl
static int count;
typedef void entry_pt();
void _GLOBAL__FI_libfn_sl() {
     ++count;
}
void _GLOBAL__FD_libfn_sl() {
}
void _GLOBAL__DI() {
     _GLOBAL__FI_libfn_sl();
}
void _GLOBAL__DD() {
    _GLOBAL__FD_libfn_sl();
}
========== end of c_file

/users/ptdesign/bin.hppa/gcc -c -o /tmp/cca04216.o /tmp/cca04216.c
/usr/bin/ld -b -o /tmp/libfn.sl -L/users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2 -L/users/ptdesign/gnu/hppa/lib fn.o /tmp/cca04216.o
/usr/bin/ld: DP-Relative Code in file /tmp/cca04216.o - Shared Library must be Position-Independent 
collect2: ld returned 1 exit status
[Leaving /tmp/cca04216.c]
[Leaving /tmp/cca04216.o]
[Leaving /tmp/cca04216.x]
[Leaving /tmp/cca04216.ld]
[Leaving /tmp/libfn.sl]
cxh@hewlett 24%


As a workaround, compile the interim .c file that collect produced with -fPIC:

cxh@hewlett 24% /users/ptdesign/bin.hppa/gcc -fPIC -c -o /tmp/cca04216.o /tmp/cca04216.c

Run the linker by hand:

cxh@hewlett 25% /usr/bin/ld -b -o /tmp/libfn.sl -L/users/ptdesign/gnu/hppa/lib/gcc-lib/hppa1.1-hp-hpux10.01/2.7.2 -L/users/ptdesign/gnu/hppa/lib fn.o /tmp/cca04216.o

The shared library is produced:

cxh@hewlett 26% file libfn.sl
libfn.sl:       s800 shared library -not stripped

From collect.c, I can see that collect reads environment variables
that get passed from the parent gcc, but I can't seem to override
them.  

Am I dropping a bit here?  The same commands work with gcc-2.7.2 under
Solaris2.4, which does not use collect, and SunOS4.1.3, which does use
collect.

-Christopher

Christopher Hylands, Ptolemy Project Manager  University of California
cxh@eecs.berkeley.edu 			      US Mail: 558 Cory Hall #1770
ph: (510)643-9841 fax:(510)642-2739	      Berkeley, CA 94720-1770
home: (510)526-4010 (if busy -4068)	      (Office: 493 Cory)
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads