| 1 | ?RCS: $Id: dlsrc.U,v$ |
| 2 | ?RCS: |
| 3 | ?RCS: Copyright (c) 1996-1998, Andy Dougherty |
| 4 | ?RCS: |
| 5 | ?RCS: You may distribute under the terms of either the GNU General Public |
| 6 | ?RCS: License or the Artistic License, as specified in the README file. |
| 7 | ?RCS: |
| 8 | ?RCS: $Log: dlsrc.U,v $ |
| 9 | ?RCS: |
| 10 | ?X: hpux support thanks to Jeff Okamoto <okamoto@hpcc101.corp.hp.com> |
| 11 | ?X: |
| 12 | ?X: To create a shared library, you must compile ALL source files in the |
| 13 | ?X: library with +z (or possibly +Z if the library is whopping huge), |
| 14 | ?X: then link the library with -b. Example: |
| 15 | ?X: cc -c +z module_a.c |
| 16 | ?X: cc -c +z module_b.c |
| 17 | ?X: ld -b module_a.o module_b.o -o module.sl |
| 18 | ?X: |
| 19 | ?MAKE:usedl ld dlsrc cccdlflags lddlflags ccdlflags bin_ELF ld_can_script: \ |
| 20 | rm_try Getfile Myread test osname sed i_dld d_dlopen Findhdr Setvar \ |
| 21 | src run cc ccflags ldflags optimize ls gccversion cat rsrc i_stdlib \ |
| 22 | i_unistd |
| 23 | ?MAKE: -pick add $@ %< |
| 24 | ?Y:BOTTOM |
| 25 | ?S:usedl: |
| 26 | ?S: This variable indicates if the system supports dynamic |
| 27 | ?S: loading of some sort. See also dlsrc and dlobj. |
| 28 | ?S:. |
| 29 | ?S:ld: |
| 30 | ?S: This variable indicates the program to be used to link |
| 31 | ?S: libraries for dynamic loading. On some systems, it is 'ld'. |
| 32 | ?S: On ELF systems, it should be $cc. Mostly, we'll try to respect |
| 33 | ?S: the hint file setting. |
| 34 | ?S:. |
| 35 | ?S:dlsrc: |
| 36 | ?S: This variable contains the name of the dynamic loading file that |
| 37 | ?S: will be used with the package. |
| 38 | ?S:. |
| 39 | ?S:cccdlflags: |
| 40 | ?S: This variable contains any special flags that might need to be |
| 41 | ?S: passed with 'cc -c' to compile modules to be used to create a shared |
| 42 | ?S: library that will be used for dynamic loading. For hpux, this |
| 43 | ?S: should be +z. It is up to the makefile to use it. |
| 44 | ?S:. |
| 45 | ?S:lddlflags: |
| 46 | ?S: This variable contains any special flags that might need to be |
| 47 | ?S: passed to $ld to create a shared library suitable for dynamic |
| 48 | ?S: loading. It is up to the makefile to use it. For hpux, it |
| 49 | ?S: should be '-b'. For sunos 4.1, it is empty. |
| 50 | ?S:. |
| 51 | ?S:ccdlflags: |
| 52 | ?S: This variable contains any special flags that might need to be |
| 53 | ?S: passed to cc to link with a shared library for dynamic loading. |
| 54 | ?S: It is up to the makefile to use it. For sunos 4.1, it should |
| 55 | ?S: be empty. |
| 56 | ?S:. |
| 57 | ?S:bin_ELF: |
| 58 | ?S: This variable saves the result from configure if generated binaries |
| 59 | ?S: are in ELF format. Only set to defined when the test has actually |
| 60 | ?S: been performed, and the result was positive. |
| 61 | ?S:. |
| 62 | ?S:ld_can_script: |
| 63 | ?S: This variable shows if the loader accepts scripts in the form of |
| 64 | ?S: -Wl,--version-script=ld.script. This is currently only supported |
| 65 | ?S: for GNU ld on ELF in dynamic loading builds. |
| 66 | ?S:. |
| 67 | ?C:USE_DYNAMIC_LOADING ~ %<: |
| 68 | ?C: This symbol, if defined, indicates that dynamic loading of |
| 69 | ?C: some sort is available. |
| 70 | ?C:. |
| 71 | ?H:?%<:#$usedl USE_DYNAMIC_LOADING /**/ |
| 72 | ?H:. |
| 73 | ?W:%<:dlopen |
| 74 | ?T:dldir thisflag tdir |
| 75 | ?F:!a.out |
| 76 | : determine which dynamic loading, if any, to compile in |
| 77 | echo " " |
| 78 | dldir="ext/DynaLoader" |
| 79 | case "$usedl" in |
| 80 | $define|y|true) |
| 81 | dflt='y' |
| 82 | usedl="$define" |
| 83 | ;; |
| 84 | $undef|n|false) |
| 85 | dflt='n' |
| 86 | usedl="$undef" |
| 87 | ;; |
| 88 | *) |
| 89 | dflt='n' |
| 90 | case "$d_dlopen" in |
| 91 | $define) dflt='y' ;; |
| 92 | esac |
| 93 | case "$i_dld" in |
| 94 | $define) dflt='y' ;; |
| 95 | esac |
| 96 | : Does a dl_xxx.xs file exist for this operating system |
| 97 | $test -f $rsrc/$dldir/dl_${osname}.xs && dflt='y' |
| 98 | ;; |
| 99 | esac |
| 100 | rp="Do you wish to use dynamic loading?" |
| 101 | . ./myread |
| 102 | usedl="$ans" |
| 103 | bin_ELF="$undef" |
| 104 | case "$ans" in |
| 105 | y*) usedl="$define" |
| 106 | case "$dlsrc" in |
| 107 | '') |
| 108 | if $test -f $rsrc/$dldir/dl_${osname}.xs ; then |
| 109 | dflt="$dldir/dl_${osname}.xs" |
| 110 | elif $test "$d_dlopen" = "$define" ; then |
| 111 | dflt="$dldir/dl_dlopen.xs" |
| 112 | elif $test "$i_dld" = "$define" ; then |
| 113 | dflt="$dldir/dl_dld.xs" |
| 114 | else |
| 115 | dflt='' |
| 116 | fi |
| 117 | ;; |
| 118 | *) dflt="$dldir/$dlsrc" |
| 119 | ;; |
| 120 | esac |
| 121 | echo "The following dynamic loading files are available:" |
| 122 | : Can not go over to $dldir because getfile has path hard-coded in. |
| 123 | tdir=`pwd`; cd "$rsrc"; $ls -C $dldir/dl*.xs; cd "$tdir" |
| 124 | rp="Source file to use for dynamic loading" |
| 125 | fn="fne" |
| 126 | gfpth="$src" |
| 127 | . ./getfile |
| 128 | usedl="$define" |
| 129 | : emulate basename |
| 130 | dlsrc=`echo $ans | $sed -e 's%.*/\([^/]*\)$%\1%'` |
| 131 | |
| 132 | $cat << EOM |
| 133 | |
| 134 | Some systems may require passing special flags to $cc -c to |
| 135 | compile modules that will be used to create a shared library. |
| 136 | To use no flags, say "none". |
| 137 | |
| 138 | EOM |
| 139 | case "$cccdlflags" in |
| 140 | '') case "$gccversion" in |
| 141 | '') case "$osname" in |
| 142 | hpux) dflt='+z' ;; |
| 143 | next) dflt='none' ;; |
| 144 | irix*) dflt='-KPIC' ;; |
| 145 | svr4*|esix*|solaris|nonstopux) dflt='-KPIC' ;; |
| 146 | sunos) dflt='-pic' ;; |
| 147 | *) dflt='none' ;; |
| 148 | esac |
| 149 | ;; |
| 150 | *) case "$osname" in |
| 151 | darwin) dflt='none' ;; |
| 152 | linux*|svr4*|esix*|solaris|nonstopux) dflt='-fPIC' ;; |
| 153 | *) dflt='-fpic' ;; |
| 154 | esac ;; |
| 155 | esac ;; |
| 156 | ' ') dflt='none' ;; |
| 157 | *) dflt="$cccdlflags" ;; |
| 158 | esac |
| 159 | rp="Any special flags to pass to $cc -c to compile shared library modules?" |
| 160 | . ./myread |
| 161 | case "$ans" in |
| 162 | ?X: Use ' ' so that a subsequent Configure run preserves the old state. |
| 163 | none) cccdlflags=' ' ;; |
| 164 | *) cccdlflags="$ans" ;; |
| 165 | esac |
| 166 | |
| 167 | cat << EOM |
| 168 | |
| 169 | Some systems use ld to create libraries that can be dynamically loaded, |
| 170 | while other systems (such as those using ELF) use $cc. |
| 171 | |
| 172 | EOM |
| 173 | case "$ld" in |
| 174 | '') $cat >try.c <<EOM |
| 175 | /* Test for whether ELF binaries are produced */ |
| 176 | #include <fcntl.h> |
| 177 | #$i_stdlib I_STDLIB |
| 178 | #ifdef I_STDLIB |
| 179 | #include <stdlib.h> |
| 180 | #endif |
| 181 | #$i_unistd I_UNISTD |
| 182 | #ifdef I_UNISTD |
| 183 | #include <unistd.h> |
| 184 | #endif |
| 185 | int main() { |
| 186 | char b[4]; |
| 187 | int i = open("a.out",O_RDONLY); |
| 188 | if(i == -1) |
| 189 | exit(1); /* fail */ |
| 190 | if(read(i,b,4)==4 && b[0]==127 && b[1]=='E' && b[2]=='L' && b[3]=='F') |
| 191 | exit(0); /* succeed (yes, it's ELF) */ |
| 192 | else |
| 193 | exit(1); /* fail */ |
| 194 | } |
| 195 | EOM |
| 196 | if $cc $ccflags $ldflags try.c >/dev/null 2>&1 && $run ./a.out; then |
| 197 | cat <<EOM |
| 198 | You appear to have ELF support. I'll use $cc to build dynamic libraries. |
| 199 | EOM |
| 200 | dflt="$cc" |
| 201 | bin_ELF="$define" |
| 202 | else |
| 203 | echo "I'll use ld to build dynamic libraries." |
| 204 | dflt='ld' |
| 205 | fi |
| 206 | $rm_try |
| 207 | ;; |
| 208 | *) dflt="$ld" |
| 209 | ;; |
| 210 | esac |
| 211 | |
| 212 | rp="What command should be used to create dynamic libraries?" |
| 213 | . ./myread |
| 214 | ld="$ans" |
| 215 | |
| 216 | cat << EOM |
| 217 | |
| 218 | Some systems may require passing special flags to $ld to create a |
| 219 | library that can be dynamically loaded. If your ld flags include |
| 220 | -L/other/path options to locate libraries outside your loader's normal |
| 221 | search path, you may need to specify those -L options here as well. To |
| 222 | use no flags, say "none". |
| 223 | |
| 224 | EOM |
| 225 | case "$lddlflags" in |
| 226 | '') case "$osname" in |
| 227 | beos) dflt='-nostart' ;; |
| 228 | haiku) dflt='-shared' ;; |
| 229 | hpux) dflt='-b'; |
| 230 | case "$gccversion" in |
| 231 | '') dflt="$dflt +vnocompatwarnings" ;; |
| 232 | esac |
| 233 | ;; |
| 234 | linux|irix*|gnu*) dflt="-shared $optimize" ;; |
| 235 | next) dflt='none' ;; |
| 236 | solaris) dflt='-G' ;; |
| 237 | sunos) dflt='-assert nodefinitions' ;; |
| 238 | svr4*|esix*|nonstopux) dflt="-G $ldflags" ;; |
| 239 | *) dflt='none' ;; |
| 240 | esac |
| 241 | ;; |
| 242 | *) dflt="$lddlflags" ;; |
| 243 | esac |
| 244 | |
| 245 | : Try to guess additional flags to pick up local libraries. |
| 246 | : Be careful not to append to a plain 'none' |
| 247 | case "$dflt" in |
| 248 | none) dflt='' ;; |
| 249 | esac |
| 250 | for thisflag in $ldflags; do |
| 251 | case "$thisflag" in |
| 252 | -L*|-R*|-Wl,-R*) |
| 253 | case " $dflt " in |
| 254 | *" $thisflag "*) ;; |
| 255 | *) dflt="$dflt $thisflag" ;; |
| 256 | esac |
| 257 | ;; |
| 258 | esac |
| 259 | done |
| 260 | |
| 261 | case "$dflt" in |
| 262 | ''|' ') dflt='none' ;; |
| 263 | esac |
| 264 | |
| 265 | case "$ldflags" in |
| 266 | *-fstack-protector*) |
| 267 | case "$dflt" in |
| 268 | *-fstack-protector*) ;; # Don't add it again |
| 269 | *) dflt="$dflt -fstack-protector" ;; |
| 270 | esac |
| 271 | ;; |
| 272 | esac |
| 273 | |
| 274 | |
| 275 | rp="Any special flags to pass to $ld to create a dynamically loaded library?" |
| 276 | . ./myread |
| 277 | case "$ans" in |
| 278 | ?X: Use ' ' so that a subsequent Configure run preserves the old state. |
| 279 | none) lddlflags=' ' ;; |
| 280 | *) lddlflags="$ans" ;; |
| 281 | esac |
| 282 | |
| 283 | cat <<EOM |
| 284 | |
| 285 | Some systems may require passing special flags to $cc to indicate that |
| 286 | the resulting executable will use dynamic linking. To use no flags, |
| 287 | say "none". |
| 288 | |
| 289 | EOM |
| 290 | case "$ccdlflags" in |
| 291 | '') case "$osname" in |
| 292 | linux|hpux|gnu*) dflt='-Wl,-E' ;; |
| 293 | next|sunos) dflt='none' ;; |
| 294 | *) dflt='none' ;; |
| 295 | esac ;; |
| 296 | ' ') dflt='none' ;; |
| 297 | *) dflt="$ccdlflags" ;; |
| 298 | esac |
| 299 | rp="Any special flags to pass to $cc to use dynamic linking?" |
| 300 | . ./myread |
| 301 | case "$ans" in |
| 302 | ?X: Use ' ' so that a subsequent Configure run preserves the old state. |
| 303 | none) ccdlflags=' ' ;; |
| 304 | *) ccdlflags="$ans" ;; |
| 305 | esac |
| 306 | ;; |
| 307 | ?X: End of usedl=y section |
| 308 | *) usedl="$undef" |
| 309 | ld='ld' |
| 310 | dlsrc='dl_none.xs' |
| 311 | lddlflags='' |
| 312 | ccdlflags='' |
| 313 | ;; |
| 314 | esac |
| 315 | |
| 316 | ld_can_script="$undef" |
| 317 | case "$bin_ELF$usedl" in |
| 318 | $define$define) |
| 319 | # Abuse try.h and a.out names for neat cleanup |
| 320 | $cat >try.c <<EOM |
| 321 | void foo() {} |
| 322 | void bar() {} |
| 323 | EOM |
| 324 | $cat >try.h <<EOM |
| 325 | LIBTEST_42 { |
| 326 | global: |
| 327 | foo; |
| 328 | local: *; |
| 329 | }; |
| 330 | EOM |
| 331 | if $cc $cccdlflags $ccdlflags $ccflags \ |
| 332 | $ldflags $lddlflags -o a.out try.c \ |
| 333 | -Wl,--version-script=try.h >/dev/null 2>&1 \ |
| 334 | && $test -s a.out ; then |
| 335 | echo "ld supports scripting" >&4 |
| 336 | ld_can_script="$define" |
| 337 | else |
| 338 | echo "ld does not support scripting" >&4 |
| 339 | fi |
| 340 | $rm_try |
| 341 | ;; |
| 342 | esac |
| 343 | |