LINUX.ORG.RU
Ответ на: комментарий от i-rinat

Ну, я собрал 3.18 с патчами и defconfig. Пару опций отключил в конфиге, перестало линковаться.

CYB3R ★★★★★
() автор топика
Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от anonymous

Внезапно сайт разработчика

Там говорится, что по сравнению с uclibc все просто зашибись

Ну а с clang и так всё ясно.

Что тебе ясно?

annulen ★★★★★
()

Сейчас попытался собрать hello word, но не вышло:

$ musl-clang hello.c
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o: In function `_start':
/build/buildd/glibc-2.21/csu/../sysdeps/x86_64/start.S:111: undefined reference to `__libc_csu_fini'
/build/buildd/glibc-2.21/csu/../sysdeps/x86_64/start.S:112: undefined reference to `__libc_csu_init'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
golovin@u410:~/Документы/Development/llvm-linux/hello$ musl-clang hello.c -v
Ubuntu clang version 3.6.0-2ubuntu1 (tags/RELEASE_360/final) (based on LLVM 3.6.0)
Target: x86_64-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.2
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.0.1
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.2
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5.0.1
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/usr/lib/llvm-3.6/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name hello.c -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -target-linker-version 2.25 -v -dwarf-column-info -nostdsysteminc -nobuiltininc -resource-dir /usr/lib/llvm-3.6/bin/../lib/clang/3.6.0 -isystem /include -fdebug-compilation-dir /home/golovin/Документы/Development/llvm-linux/hello -ferror-limit 19 -fmessage-length 79 -mstackrealign -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/hello-caabdd.o -x c hello.c
clang -cc1 version 3.6.0 based upon LLVM 3.6.0 default target x86_64-pc-linux-gnu
#include "..." search starts here:
#include <...> search starts here:
 /include
End of search list.
 "/bin/ld.musl-clang" --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/crtbegin.o -L-user-start -L/lib -L-user-end -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../.. -L/usr/lib/llvm-3.6/bin/../lib -L/lib -L/usr/lib /tmp/hello-caabdd.o -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/crtend.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crtn.o
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o: In function `_start':
/build/buildd/glibc-2.21/csu/../sysdeps/x86_64/start.S:111: undefined reference to `__libc_csu_fini'
/build/buildd/glibc-2.21/csu/../sysdeps/x86_64/start.S:112: undefined reference to `__libc_csu_init'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

CYB3R ★★★★★
() автор топика
Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от annulen

у тебя start.S от glibc берется

А как ему это запретить?
Очень хочу скомпилировать non GNU Hello World.
Ещё я не понимаю, зачем это clang смотрит на установленные версии GCC. Выходные бинарники ведь не будут слинкованы с libgcc?

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от Stil

musl-clang

#!/bin/sh
cc="clang"
libc=""
libc_inc="/include"
libc_lib="/lib"
thisdir="`cd "$(dirname "$0")"; pwd`"

# prevent clang from running the linker (and erroring) on no input.
sflags=
eflags=
for x ; do
    case "$x" in
        -l*) input=1 ;;
        *) input= ;;
    esac
    if test "$input" ; then
        sflags="-l-user-start"
        eflags="-l-user-end"
        break
    fi
done

exec $cc \
    -B"$thisdir" \
    -fuse-ld=musl-clang \
    -static-libgcc \
    -nostdinc \
    --sysroot "$libc" \
    -isystem "$libc_inc" \
    -L-user-start \
    $sflags \
    "$@" \
    $eflags \
    -L"$libc_lib" \
    -L-user-end
ld.musl-clang
#!/bin/sh
cc="clang"
libc_lib="/lib"
ldso="/lib/ld-musl-x86_64.so.1"
cleared=
shared=
userlinkdir=
userlink=

for x ; do
    test "$cleared" || set -- ; cleared=1

    case "$x" in
        -L-user-start)
            userlinkdir=1
            ;;
        -L-user-end)
            userlinkdir=
            ;;
        -L*)
            test "$userlinkdir" && set -- "$@" "$x"
            ;;
        -l-user-start)
            userlink=1
            ;;
        -l-user-end)
            userlink=
            ;;
        crtbegin*.o|crtend*.o)
            set -- "$@" $($cc -print-file-name=$x)
            ;;
        -lgcc|-lgcc_eh)
            file=lib${x#-l}.a
            set -- "$@" $($cc -print-file-name=$file)
            ;;
        -l*)
            test "$userlink" && set -- "$@" "$x"
            ;;
        -shared)
            shared=1
            set -- "$@" -shared
            ;;
        -sysroot=*|--sysroot=*)
            ;;
        *)
            set -- "$@" "$x"
            ;;
    esac
done

exec $($cc -print-prog-name=ld) -nostdlib "$@" -lc -dynamic-linker "$ldso"

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от Stil

Да, действительно.

$clang -print-prog-name=ld
/usr/bin/ld
lld в репах нет. Когда соберу, отпишусь. Как принудить clang использовать lld по умолчанию?
Может, там ещё что-то из GNU binutils используется? Тоже нужно исключить.

CYB3R ★★★★★
() автор топика
Последнее исправление: CYB3R (всего исправлений: 4)
Ответ на: комментарий от Stil

Я не знаю, как это надо собирать.

-- The C compiler identification is GNU 4.9.2
-- The CXX compiler identification is GNU 4.9.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:5 (string):
  string sub-command REGEX, mode MATCH needs at least 5 arguments total to
  command.


-- LLD version: 
CMake Error at CMakeLists.txt:9 (string):
  string sub-command REGEX, mode REPLACE needs at least 6 arguments total to
  command.


CMake Error at CMakeLists.txt:11 (string):
  string sub-command REGEX, mode REPLACE needs at least 6 arguments total to
  command.


CMake Error at lib/Config/CMakeLists.txt:1 (add_llvm_library):
  Unknown CMake command "add_llvm_library".


CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 3.2)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring incomplete, errors occurred!

CYB3R ★★★★★
() автор топика

Я бы отсюда начал

http://ellcc.org

в качестве системы сборки взять

http://buildroot.net

там можно указать внешний компилятор просто прописав в конфиге, а дальше - как повезет :) но думаю должно все получиться.

anonymous
()
Ответ на: комментарий от anonymous

ellcc

Я смотрел в сторону ELLCC, так толком и не разобрался с ним. Там используется GNU binutils, от которых хочу отказаться.

buildroot

С этой штукой я работал. Даже сначала были позитивные впечатления. Но они быстро выветрились, одни ругательства остались.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

lld в репах нет

Тебе это не нужно, используй GNU binutils, или на худой конец mclinker

annulen ★★★★★
()
Ответ на: комментарий от annulen

Я знаю :)
Именно toybox я и пытаюсь собрать. Там, кстати, был один мой патч. Но он уже вытеснен лучшим кодом.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Вообще говоря, ld - это компонент тулчейна, а не ОС, поэтому его использование не сделает твою систему «гнутой».

Но если с фанатизмом, тот лучше все-таки попробовать mclinker, насколько я знаю, он намного ближе к продакшену, чем lld, авторы последнего даже не могут толком определиться, что они хотят разработать

http://lists.llvm.org/pipermail/llvm-dev/2015-May/085196.html

annulen ★★★★★
()
Ответ на: комментарий от CYB3R

Учти, что самая больная тема «альтернативных» линкеров - поддержка linker scripts, это сложно в реализации, но без этого не соберутся многие вундерфали

annulen ★★★★★
()
Ответ на: комментарий от annulen

Что же это за система, которая не может пересобрать себя саму? А для этого понадобятся binutils. Неужели нет им альтернативы? Попробую собрать mclinker.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Что же это за система, которая не может пересобрать себя саму?

Куча систем не могут это делать в изкоробочном состоянии. Возьми хоть ту же Убунту, в стандартной поставке которой нет ни компилятора, ни binutils.

А когда юзер захочет собирать, он поставит из портов (или что у тебя там) binutils и будет собирать (может и gcc поставит, во фре до сих пор куча портов шлангом не собирается)

annulen ★★★★★
()
Ответ на: комментарий от CYB3R

Собрал наконец-то helloworld. Всё работает.

CYB3R ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.