Skip to content

glibc depends on order of top-level asm blocks and functions #2515

@edwintorok

Description

@edwintorok
Bugzilla Link 2143
Resolution INVALID
Resolved on Apr 27, 2008 18:16
Version unspecified
OS Linux
Attachments initfini.c, Makefile used to build initfini.s, crtn.S, ..., generated from initfini.s built using gcc, generated from initfini.s built using gcc, initfini.s generated by gcc, crtn.S generated from initfini.s built by llvm, crti.S generated from initfini.s built by llvm, initfini.s generated by llvm
CC @asl

Extended Description

Generating crti.S, crtn.S, initfini.s is done via a call to compiler -S, and postprocessed using sed.
Unfortunately llvm's output is not what glibc's build system expects, and the result is wrong crti.S, crtn.S with a linker error about duplicate symbols.

As a comment in csu/Makefile says:
"In ELF we also install crti.o and crtn.o, special "initializer" and "finalizer" files used in the link to make the .init and .fini sections work right; both these files are built (in an arcane manner) from initfini.c"

This is the linker error:
/home/edwin/llvm/install/bin/llvm-gcc -nostdlib -nostartfiles -o /home/edwin/glibc-2.7/build-tree/i386-libc/iconv/iconvconfig -Wl,-dynamic-linker=/lib/ld-linux.so.2 -Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both /home/edwin/glibc-2.7/build-tree/i386-libc/csu/crt1.o /home/edwin/glibc-2.7/build-tree/i386-libc/csu/crti.o /home/edwin/llvm/install/bin/llvm-gcc --print-file-name=crtbegin.o /home/edwin/glibc-2.7/build-tree/i386-libc/iconv/iconvconfig.o /home/edwin/glibc-2.7/build-tree/i386-libc/iconv/strtab.o /home/edwin/glibc-2.7/build-tree/i386-libc/iconv/xmalloc.o /home/edwin/glibc-2.7/build-tree/i386-libc/iconv/hash-string.o -Wl,-rpath-link=/home/edwin/glibc-2.7/build-tree/i386-libc:/home/edwin/glibc-2.7/build-tree/i386-libc/math:/home/edwin/glibc-2.7/build-tree/i386-libc/elf:/home/edwin/glibc-2.7/build-tree/i386-libc/dlfcn:/home/edwin/glibc-2.7/build-tree/i386-libc/nss:/home/edwin/glibc-2.7/build-tree/i386-libc/nis:/home/edwin/glibc-2.7/build-tree/i386-libc/rt:/home/edwin/glibc-2.7/build-tree/i386-libc/resolv:/home/edwin/glibc-2.7/build-tree/i386-libc/crypt:/home/edwin/glibc-2.7/build-tree/i386-libc/nptl /home/edwin/glibc-2.7/build-tree/i386-libc/libc.so.6 /home/edwin/glibc-2.7/build-tree/i386-libc/libc_nonshared.a -lgcc -Wl,--as-needed -lgcc_s -Wl,--no-as-needed /home/edwin/llvm/install/bin/llvm-gcc --print-file-name=crtend.o /home/edwin/glibc-2.7/build-tree/i386-libc/csu/crtn.o
/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crtn.o: In function dummy': /home/edwin/glibc-2.7/build-tree/i386-libc/csu/crtn.S:15: multiple definition of dummy'
/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crti.o:/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crti.S:36: first defined here
/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crtn.o: In function _init': /home/edwin/glibc-2.7/build-tree/i386-libc/csu/crtn.S:41: multiple definition of _init'
/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crti.o:/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crti.S:88: first defined here
/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crtn.o: In function _fini': /home/edwin/glibc-2.7/build-tree/i386-libc/csu/crtn.S:100: multiple definition of _fini'
/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crti.o:/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crti.S:152: first defined here
/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crti.o: In function _fini': (.fini+0x14): undefined reference to i_am_not_a_leaf'
/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crtn.o: In function _fini': (.fini+0x27): undefined reference to i_am_not_a_leaf'
/home/edwin/glibc-2.7/build-tree/i386-libc/csu/crtn.o: In function _fini': (.fini+0x2c): undefined reference to i_am_not_a_leaf'
collect2: ld returned 1 exit status

I will attach initfini.c, and the initfini.s, crti.S, crtn.S generated by gcc and llvm.

At a first glance it looks like inline assembly comments are emitted at the wrong place (too early):

csu/initfini.s is the gcc one, ../i386-libc/csu/initfini.s is llvm's.

--- csu/initfini.s 2008-03-12 17:36:26.837217313 +0200
+++ ../i386-libc/csu/initfini.s 2008-03-12 17:12:39.480693562 +0200
@@ -1,36 +1,57 @@

  • .file "initfini.c"
    -#APP
    +# Start of file scope inline assembly

#include "defs.h"

/@HEADER_ENDS/

/@TESTS_BEGIN/
-#NO_APP
+
+/@TESTS_END/
+
+/@_init_PROLOG_BEGINS/
+.section .init
+END_INIT
+
+/@_init_EPILOG_ENDS/
+
+/@_fini_PROLOG_BEGINS/
+.section .fini
+END_FINI
+
+/@_fini_EPILOG_ENDS/
+
+/@TRAILER_BEGINS/
+# End of file scope inline assembly
+
+
.text

  • .p2align 2,,3
  • .align 16
    .globl dummy
    .type dummy, @​function
    dummy:
    pushl %ebp
    movl %esp, %ebp
  • subl $8, %esp
  • pushl %ebx
  • subl $4, %esp
  • call .Lllvm$1.$piclabel
    +.Lllvm$1.$piclabel:
  • popl %ebx
  • addl $GLOBAL_OFFSET_TABLE + [.-.Lllvm$1.$piclabel], %ebx
    movl 8(%ebp), %eax
    testl %eax, %eax
  • je .L4
  • je .LBB1_2 # UnifiedReturnBlock
    +.LBB1_1: # bb
    call *%eax
    -.L4:
  • leave
    +.LBB1_2: # UnifiedReturnBlock
  • addl $4, %esp
  • popl %ebx
  • popl %ebp
    ret
    -#APP
  • .size dummy, .-dummy

-/@TESTS_END/

-/@_init_PROLOG_BEGINS/
.section .init
-#NO_APP

  • .section .init,"ax",@progbits
  • .p2align 2,,3
  • .align 16
    .globl _init
    .type _init, @​function
    _init:
    @@ -38,38 +59,41 @@
    movl %esp, %ebp
    pushl %ebx
    subl $4, %esp
  • call .L10
    -.L10:
  • call .Lllvm$2.$piclabel
    +.Lllvm$2.$piclabel:
    popl %ebx
  • addl $GLOBAL_OFFSET_TABLE+[.-.L10], %ebx
  • movl gmon_start@got(%ebx), %edx
  • testl %edx, %edx
  • je .L7
  • addl $GLOBAL_OFFSET_TABLE + [.-.Lllvm$2.$piclabel], %ebx
  • cmpl $0, gmon_start@got(%ebx)
  • je .LBB2_2 # bb4
    +.LBB2_1: # bb
    call gmon_start@plt
    -.L7:
    +.LBB2_2: # bb4
    #APP
    ALIGN
  • #NO_APP
  • #APP
    END_INIT
  • #NO_APP
  • #APP

/@_init_PROLOG_ENDS/

  • #NO_APP
  • #APP

/@_init_EPILOG_BEGINS/

  • #NO_APP
  • #APP
    .section .init
    #NO_APP
  • popl %eax
  • addl $4, %esp
    popl %ebx
  • leave
  • popl %ebp
    ret
    -#APP
  • END_INIT
  • .size _init, .-_init

-/@_init_EPILOG_ENDS/

-/@_fini_PROLOG_BEGINS/
.section .fini
-#NO_APP

  • .section .fini,"ax",@progbits
  • .p2align 2,,3
  • .align 16
    .globl _fini
    .type _fini, @​function
    _fini:
    @@ -77,13 +101,17 @@
    movl %esp, %ebp
    pushl %ebx
    subl $4, %esp
  • call .L13
    -.L13:
  • call .Lllvm$3.$piclabel
    +.Lllvm$3.$piclabel:
    popl %ebx
  • addl $GLOBAL_OFFSET_TABLE+[.-.L13], %ebx
  • addl $GLOBAL_OFFSET_TABLE + [.-.Lllvm$3.$piclabel], %ebx
    #APP
    ALIGN
  • #NO_APP
  • #APP
    END_FINI
  • #NO_APP
  • #APP

/@_fini_PROLOG_ENDS/
#NO_APP
@@ -91,18 +119,15 @@
#APP

/@_fini_EPILOG_BEGINS/

  • #NO_APP
  • #APP
    .section .fini
    #NO_APP
  • popl %ecx
  • addl $4, %esp
    popl %ebx
  • leave
  • popl %ebp
    ret
    -#APP
  • END_FINI

-/@_fini_EPILOG_ENDS/

-/@TRAILER_BEGINS/

  • .size _fini, .-_fini
    .weak gmon_start
  • .ident "GCC: (GNU) 4.2.3 (Debian 4.2.3-2)"
  • .section .note.GNU-stack,"",@progbits
  • .ident "GCC: (GNU) 4.2.1 (Based on Apple Inc. build 5546) (LLVM build)"

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugzillaIssues migrated from bugzillainvalidResolved as invalid, i.e. not a bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions