LINUX.ORG.RU

clang + musl = segfault?

 , , , ,


1

2

Собрал clang, собрал musl, запускаю — Segmentation fault.
Как это дебажить? Что такое странное этот musl пытается сделать?

(gdb) run
Starting program: /path/to/ld-musl-x86_64.so.1 

Program received signal SIGSEGV, Segmentation fault.
0x00000000000e1ae6 in ?? ()
(gdb) where
#0  0x00000000000e1ae6 in ?? ()
#1  0x000055555563063d in find_sym (dso=0x55555563e110 <ldso>, s=0x5555555904e5 «memset», need_def=1) at ../ldso/dynlink.c:263
#2  0x000055555563481b in do_relocs (dso=0x55555563e110 <ldso>, rel=0x555555595cf0, rel_size=16872, stride=3) at ../ldso/dynlink.c:337
#3  0x00005555556304ae in reloc_all (p=0x55555563e110 <ldso>) at ../ldso/dynlink.c:1151
#4  0x00005555556300af in __dls2 (base=0x555555554000 «\177ELF\002\001\001», sp=0x7fffffffe0e0) at ../ldso/dynlink.c:1375
#5  0x000055555562f6df in _dlstart_c (sp=0x7fffffffe0e0, dynv=0x5555556393c0) at ../ldso/dlstart.c:147
#6  0x000055555562f27a in _dlstart ()
(gdb) list
1	#define _GNU_SOURCE
2	#include <stdio.h>
3	#include <stdlib.h>
4	#include <stdarg.h>
5	#include <stddef.h>
6	#include <string.h>
7	#include <unistd.h>
8	#include <stdint.h>
9	#include <elf.h>
10	#include <sys/mman.h>
(gdb) c
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.

★★★★★

find_sym (dso=0x55555563e110 <ldso>, s=0x5555555904e5 «memset», need_def=1) at ../ldso/dynlink.c:263

И что же там по этой строчке (и с начала функции)?

gag ★★★★★
()
Ответ на: комментарий от gag
   259	static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
   260	{
   261		uint32_t h = 0, gh, gho, *ght;
   262		size_t ghm = 0;
   263		struct symdef def = {0};
   264		for (; dso; dso=dso->next) {
   265			Sym *sym;
   266			if (!dso->global) continue;
   267			if ((ght = dso->ghashtab)) {
   268				if (!ghm) {
   269					gh = gnu_hash(s);
   270					int maskbits = 8 * sizeof ghm;
   271					gho = gh / maskbits;
   272					ghm = 1ul << gh % maskbits;
   273				}
   274				sym = gnu_lookup_filtered(gh, ght, dso, s, gho, ghm);
   275			} else {
   276				if (!h) h = sysv_hash(s);
   277				sym = sysv_lookup(s, h, dso);
   278			}
   279			if (!sym) continue;
   280			if (!sym->st_shndx)
   281				if (need_def || (sym->st_info&0xf) == STT_TLS
   282				    || ARCH_SYM_REJECT_UND(sym))
   283					continue;
   284			if (!sym->st_value)
   285				if ((sym->st_info&0xf) != STT_TLS)
   286					continue;
   287			if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue;
   288			if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue;
   289	
   290			if (def.sym && sym->st_info>>4 == STB_WEAK) continue;
   291			def.sym = sym;
   292			def.dso = dso;
   293			if (sym->st_info>>4 == STB_GLOBAL) break;
   294		}
   295		return def;
   296	}
CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R
> #1  0x000055555563063d in find_sym (dso=0x55555563e110 <ldso>, s=0x5555555904e5 «memset», need_def=1) at ../ldso/dynlink.c:263

Судя по всему musl пытается вызвать memset() еще до настройки таблицы релокаций (~импорта), в которой этот memset() ищется.

>   263		struct symdef def = {0};
Есть подозрение, что gcc генерит тут вызов memset(). Нужно исправить на вызов memset() встроенного в musl (если такой есть).

Похожая проблема в glibc на ia64: http://trofi.github.io/posts/189-glibc-on-ia64-or-how-relocations-bootstrap.html

Там ld.so пытается исполнить код с еще не настроенной релокацией.

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

Я немного криво выразился, читать можно весь gsoc2016-native-clang
там процесс сборки описан. Я давно собирал, всё работало, требовало анвайнда.

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

Что там описано, уже давно просрочено. У меня сейчас немного другие цели. Так-то в этом блоге треть комментариев от меня.

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

Да, clang из svn. Проблема оказалась в не в clang'е вовсе, а в том, что musl очень криво слинкован.

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

одна из особенностей масла - он не умеет динамически сам разбираться с зависимостями линковки в рантайме. то есть, если при сборке не в том порядке указаны библиотеки - то либо не взлетает вообще, либо падает где-то позже.

а эта ругань похожа как раз на то, что линк какой-то не найден.

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

Да, именно так. Он линкуется без ошибок, но на деле получается нерабочий бинарник. Я почти решил эту проблему.

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

Наконец-то собрал clang+musl без GNU-зависимостей. В следующем году выложу мои сборочные скрипты.

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

кстати, можешь поглядеть Void Linux. они собирают с маслом много чего. репы, например, тут:
https://repo.voidlinux.eu/current/musl/
там есть clang. и он там работает. может, оттуда можно взять какие-то патчи или идеи по сборке.

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

Да, я идейно вдохновлялся и void, и alpine, и sabotage. Смотрел и на ellcc, но там все используют гнутые компоненты — никто из перечисленных не отказался от GNU binutils. Самые труднозаменимые части binutils — это as (gas) и ld (bfd, gold). Я сначала хотел использовать elftoolchain, как бздуны, а потом понял, что проект LLVM и так уже предоставляет всё, что может понадобиться. Я решил использовать LLD и crtbegin/crtend от netbsd csu (ellcc берёт их от freebsd, почти все остальные берут эти файлы от libgcc).

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

у меня нет неприязни к GNU. binutils мало влияет на качество выходного кода. а масл я использовала в эмбеддеде. он создаёт чуть менее жирные бинарники и в эмбеддеде это может быть критичным. и в нём тогда были странные проблемы с форками (я его собирала для Realtek'а). но это было давно и я решила вернуться к нему, чтобы снова потыкать палочкой, но уже на x86_64, на примере Void Linux. но там вскрылись другие проблемы и я пока это потихоньку ковыряю в параллели, как некритичную задачу.

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

Я знаю, но мой гитхаб — это не продакшн.

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