tpoechtrager / cctools-port

Apple cctools port for Linux and *BSD
728 stars 167 forks source link

cctools 949 i386 assembler broken #101

Closed kencu closed 3 years ago

kencu commented 3 years ago

Hi,

I'm trying to upgrade cctools to 949 in the MacPorts project, and I'm finding the i386 assembler is broken compared to cctools-927.

$ clang-mp-3.4 -arch i386 -no-integrated-as -o hello hello.c
ld: in /var/folders/JS/JSmhNUB9HNSSCVaN+wE+XU+++TI/-Tmp-/hello-eaff28.o, in section __TEXT,__text reloc 2: r_length=0 and r_pcrel=0 not supported for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

the x86_64 assembler is OK:

$ clang-mp-3.4 -arch x86_64 -no-integrated-as -o hello hello.c
$ ./hello
Hello, World

The i386 assembler in cctools-927 worked OK

I was wondering you had any ideas about this, or perhaps already might have tweaked your project here to fix this? If so, I can't spot the fix looking around here...

tpoechtrager commented 3 years ago

Afaik Apple does not support i386 upstream anymore, so this is kinda expected.

kencu commented 3 years ago

it's just accidentally been broken, I think.

The i386.c files are updated, and the ppc assembler still works great.

I will see if I can spot where they are building the errant relic sections.

kencu commented 3 years ago

reloc sections ... ipads ;)

kencu commented 3 years ago

I found it. This little tweak here that was added in cctools 949 chopped off some code that was used in i386 (and maybe in x86_64 as well):

diff --git a/cctools/as/write_object.c b/cctools/as/write_object.c
index 66f85f3..29f056c 100644
--- a/cctools/as/write_object.c
+++ b/cctools/as/write_object.c
@@ -1253,6 +1259,8 @@ uint32_t debug_section)
        riP->r_type = X86_64_RELOC_UNSIGNED;
        return(2 * sizeof(struct relocation_info));
 #endif
+/* the #if that follows is to silence a noisy "unreachable code" warning */
+#if defined(ARM) || defined(SPARC) || defined(HPPA) || defined (PPC)
 #ifdef PPC
        if(fixP->fx_r_type == PPC_RELOC_HI16)
            sectdiff = PPC_RELOC_HI16_SECTDIFF;
@@ -1379,6 +1387,7 @@ uint32_t debug_section)
 #endif
        *riP = *((struct relocation_info *)&sri);
        return(2 * sizeof(struct relocation_info));
+#endif /* unreachable code */
        }
        /*
         * Determine if this is left as a local relocation entry or must be

So once that was removed, the assembler works properly again.

$ port -v installed cctools
The following ports are currently installed:
  cctools @927.0.2_7 platform='darwin 8' archs='i386' date='2021-01-21T22:10:33-0800'
  cctools @949.0.1_0 (active) platform='darwin 8' archs='i386' date='2021-01-27T11:14:57-0800'
$ clang-mp-3.4 -arch i386 -v -Wl,-v -Wa,-v -no-integrated-as -o hello hello.c
clang version 3.4.2 (tags/RELEASE_34/dot2-final)
Target: i386-apple-darwin8.11.1
Thread model: posix
 "/opt/local/libexec/llvm-3.4/bin/clang" -cc1 -triple i386-apple-macosx10.4.0 -S -disable-free -disable-llvm-verifier -main-file-name hello.c -mrelocation-model pic -pic-level 2 -mdisable-fp-elim -masm-verbose -target-cpu yonah -target-linker-version 97.17 -v -resource-dir /opt/local/libexec/llvm-3.4/bin/../lib/clang/3.4.2 -fno-dwarf2-cfi-asm -fno-dwarf-directory-asm -fno-autolink -fdebug-compilation-dir /Users/cunningh/Desktop -ferror-limit 19 -fmessage-length 110 -mstackrealign -fobjc-runtime=macosx-fragile-10.4.0 -fencode-extended-block-signature -fdiagnostics-show-option -fcolor-diagnostics -vectorize-slp -o /var/tmp/hello-82a2a4.s -x c hello.c
clang -cc1 version 3.4.2 based upon LLVM 3.4.2 default target i386-apple-darwin8.11.1
ignoring nonexistent directory "/usr/local/include"
#include "..." search starts here:
#include <...> search starts here:
 /opt/local/libexec/llvm-3.4/bin/../lib/clang/3.4.2/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
 "/opt/local/bin/as" -arch i386 -force_cpusubtype_ALL -v -o /var/tmp/hello-e3887b.o /var/tmp/hello-82a2a4.s
Apple Inc version cctools-localbuild, GNU assembler version 1.38
 "/opt/local/libexec/llvm-3.4/bin/ld" -dynamic -arch i386 -macosx_version_min 10.4.0 -o hello -lcrt1.o -v /var/tmp/hello-e3887b.o -lSystem -lgcc_s.10.4 /opt/local/libexec/llvm-3.4/bin/../lib/clang/3.4.2/lib/darwin/libclang_rt.10.4.a
@(#)PROGRAM:ld  PROJECT:ld64-97.17
configured to support archs: i386 x86_64 ppc ppc64 armv6 armv7
Library search paths:
    /usr/lib
    /usr/local/lib
Framework search paths:
    /Library/Frameworks/
    /System/Library/Frameworks/
$ ./hello
Hello, World
kencu commented 3 years ago

I did this https://github.com/macports/macports-ports/pull/9796/commits/f28f47d42863d06ed88353f8716a896b75a224b3

tpoechtrager commented 3 years ago

Thanks for pointing this out!