Re: Configuration on IceLake

2021-09-10 Thread Arturo Fernandez
Maybe you're right, but I tried on Azure (running on Rocky Linux) and AWS 
(running on CentOS8) and got the same problem. I will try some other version as 
time permits and check what happens. Thanks. 
Torbjörn Granlund wrote:
Arturo Fernandez mailto:afernan...@odyhpc.com> > writes:
Sorry for the late reply as things have been piling up. I have tried
gmp-6.2.99-20210902195716 in different systems but it fails while
building it. Here is an error:
../libtool: line 1766: ../mpn/m4-ccas: Permission denied
That error you need to debug locally.
The file m4-ccas in the snapshot has the execution bit set. Prosumably
you have some strange umask value set, or a filesystem which does not
allow executables.
-- 
Torbjörn
Please encrypt, key id 0xC8601622
___
gmp-bugs mailing list
gmp-bugs@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-bugs


libgmp.a text relocation error on powerpc-*

2021-09-10 Thread George Koehler
Hello,

This report is for GMP 6.2.1.  The powerpc32 asm in the static library
libgmp.a contains a text relocation; this causes a linker error when I
use LLD to link a program with libgmp.a.  I have no problem with the
shared library.

The fix is simple: delete the quotes on `PIC_ALWAYS' in m4-asm.def:

--- mpn/asm-defs.m4.orig
+++ mpn/asm-defs.m4
@@ -1051,7 +1051,7 @@ dnl  Normally PIC is defined (or not) by libtool, but 
 dnl  systems which are always PIC.  PIC_ALWAYS established in config.m4
 dnl  identifies these for us.
 
-ifelse(`PIC_ALWAYS',`yes',`define(`PIC')')
+ifelse(PIC_ALWAYS,`yes',`define(`PIC')')
 
 
 dnl  Various possible defines passed from the Makefile that are to be tested

configure has put define(,) in my config.m4, but
the ifelse had quotes around `PIC_ALWAYS', so it doesn't expand the
macro.  It checks whether the literal string "PIC_ALWAYS" matches the
literal string "yes", which is never true, so it never does the
define(`PIC'), but this define would fix my problem.

I'm running OpenBSD-current on an old PowerPC Macintosh which uses
powerpc32 asm:

$ cc -v
OpenBSD clang version 11.1.0
Target: powerpc-unknown-openbsd6.9
Thread model: posix
InstalledDir: /usr/bin
$ ld -v
LLD 11.1.0 (compatible with GNU linkers)
$ uname -a
OpenBSD wisconsin.my.domain 7.0 GENERIC#7 macppc
$ ./config.guess  
powerpc-unknown-openbsd7.0
$ ./configfsf.guess   
powerpc-unknown-openbsd7.0

In the last release, OpenBSD 6.9, the default ld for macppc was ld.bfd
(GNU ld).  I am running OpenBSD-current (between 6.9 and 7.0), where
the default ld has changed to ld.lld (LLD from LLVM).  This is
important, because I get the linker error from LLD.

To demonstrate the linker error, I build GMP 6.2.1 with no patches.
I skip the shared library to save time,

$ cd gmp-6.2.1/
$ ./configure --disable-shared
...
checking whether compiler output is PIC by default... yes...
configure: summary of build options:

  Version:   GNU MP 6.2.1
  Host type: powerpc-unknown-openbsd7.0
  ABI:   32
  Install prefix:/usr/local
  Compiler:  cc
  Static libraries:  yes
  Shared libraries:  no
$ make
...

My example divide.c calls mpz_fdiv_q().  When I try to link it to
libgmp.a, I see a linker error:

$ cd ..
$ cat divide.c
#include 
#include 
#include 
int
main(int argc, char **argv) {
mpz_t x, y;
if (argc != 3) errx(1, "usage: ./divide x y");
mpz_init_set_str(x, argv[1], 10);
mpz_init_set_str(y, argv[2], 10);
mpz_fdiv_q(x, x, y);
printf("%s\n", mpz_get_str(NULL, 10, x));
}
$ cc -o divide divide.c -Igmp-6.2.1 gmp-6.2.1/.libs/libgmp.a
ld: error: can't create dynamic relocation R_PPC_ADDR16_HA against local symbol 
in readonly segment; recompile object files with -fPIC or pass '-Wl,-z,notext' 
to allow text relocations in the output
>>> defined in gmp-6.2.1/.libs/libgmp.a(invert_limb.o)
>>> referenced by tmp-invert_limb.s
>>>   invert_limb.o:(__gmpn_invert_limb) in archive 
>>> gmp-6.2.1/.libs/libgmp.a

ld: error: can't create dynamic relocation R_PPC_ADDR16_LO against local symbol 
in readonly segment; recompile object files with -fPIC or pass '-Wl,-z,notext' 
to allow text relocations in the output
>>> defined in gmp-6.2.1/.libs/libgmp.a(invert_limb.o)
>>> referenced by tmp-invert_limb.s
>>>   invert_limb.o:(__gmpn_invert_limb) in archive 
>>> gmp-6.2.1/.libs/libgmp.a
cc: error: linker command failed with exit code 1 (use -v to see invocation)

(If you are running OpenBSD 6.9 on macppc, where the default ld is
ld.bfd, then "cc -fuse-ld=lld" might reproduce the above error.)

These relocations come from gmp-6.2.1/mpn/powerpc32/invert_libm.asm
at LEA(r9, approx_tab); powerpc32/m4.elf defines LEA.  This GMP has
no patches, so its libgmp.a didn't define PIC.  The expansion of LEA
without PIC is,

lis r9, approx_tab@ha
la  r9, approx_tab@l(r9)

This would load r9 with the 32-bit address of approx_tab, where the
address is in the program text.  OpenBSD uses PIE position-independent
executables by default.  PIEs are dynamically relocated, so the
address of approx_tab isn't known until runtime.  The program would
need to overwrite the text with the relocated address of approx_tab.
This is awkward, because the program text is normally readonly.

A configure check, GMP_ASM_POWERPC_PIC_ALWAYS in acinclude.m4,
correctly observes that my clang outputs PIC by default, and does
define(,) in my config.m4.  The problem is that
gmp ignores this check, unless I delete the quotes on `PIC_ALWAYS'
in asm-defs.m4.  After I delete the quotes, the LEA expansion uses
the PIC asm and avoids the text relocation.  I installed a libgmp.a
with the quote fix, and it works; floor(100 / 11) is 9:

$ cc -o divide divide.c $(pkg-config --cflags --libs gmp) -static
$ ./divide 100 11
9

PIC_ALWAYS is only relevant for powerpc32 and powerpc64.