abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
včera 18:33 | Nová verze

Byla vydána nová stabilní verze 2.7 svobodné decentralizované mikroblogovací platformy a sociální sítě podobné Twitteru Mastodon (Wikipedie). Detailní přehled novinek na GitHubu.

Ladislav Hagara | Komentářů: 0
včera 00:22 | Nová verze

Byla vydána nová vývojová verze datového formátu a souvisejících nástrojů Relational pipes. Verze v0.9 obsahuje vstupní moduly pro fstab, CSV, XML a příkazový řádek; výstupní moduly pro CSV, XML, ODS (ODF), GUI (Qt), hodnoty oddělené nulovým bajtem a tabulkový výstup do konzole. Relační data lze upravovat relačními příkazy grep, cut a sed.

xkucf03 | Komentářů: 33
19.1. 18:33 | Zajímavý software

Podman dospěl do verze 1.0.0. Jedná se o nástroj umožňující vytvářet a provozovat kontejnery, aniž by uživatel potřeboval práva roota.

Ladislav Hagara | Komentářů: 0
18.1. 16:44 | Zajímavý software

Na Kickstarteru lze podpořit vývoj svobodného softwarového nástroje Akira, jenž by měl umožnit designérům designování aplikací v Linuxu. Mělo by se jednat o alternativu k proprietárním nástrojům Sketch, Figma nebo Adobe XD.

Ladislav Hagara | Komentářů: 0
18.1. 12:11 | Zajímavý článek

V Edici CZ.NIC vyšla kniha CyberSecurity věnovaná problematice kybernetické bezpečnosti, a to především jejím základním principům, které by měl respektovat každý, kdo využívá informační a komunikační technologie. Kniha je ke stažení zcela zdarma pod licenci Creative Commons (CC BY-ND 3.0 CZ) (pdf, epub, mobi).

Ladislav Hagara | Komentářů: 0
18.1. 02:00 | Nová verze

Byla vydána nová stabilní verze 0.92.4 a první alfa verze verze 1.0 svobodného multiplatformního vektorového grafického editoru Inkscape. Přehled novinek v poznámkách k vydání (0.92.4 a 1.0alpha0). Obě verze jsou k dispozici také jako balíčky ve formátu AppImage. Stačí je stáhnout, nastavit právo ke spuštění a spustit.

Ladislav Hagara | Komentářů: 6
17.1. 21:22 | Nová verze

Byla vydána verze 1.32 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

Ladislav Hagara | Komentářů: 0
17.1. 15:44 | Komunita

V říjnu byla změněna licence u multiplatformní dokumentové databáze MongoDB z GNU AGPLv3 na SSPL (Server Side Public License). Dle právníku se nejedná o svobodnou licenci. Databáze MongoDB tak nebude obsažena ve Fedoře, v Red Hat Enterprise Linuxu ani například v Debianu.

Ladislav Hagara | Komentářů: 21
17.1. 02:22 | Nová verze

Byla vydána verze 2.0 svobodné aplikace určené pro fotografování a ovládání digitálních fotoaparátů z počítače Entangle. Kódové jméno této nejnovější verze je Sodium.

Ladislav Hagara | Komentářů: 2
17.1. 01:22 | Nová verze

Byla vydána verze 2.18 svobodného webového prohlížeče pracujícího v grafickém i textovém módu Links (Wikipedie). Přehled novinek v seznamu změn. Links letos slaví 20 let. První veřejná verze 0.80 byla zveřejněna 24. listopadu 1999.

Ladislav Hagara | Komentářů: 7
Používáte USB Type-C?
 (20%)
 (16%)
 (11%)
 (12%)
 (37%)
 (3%)
 (44%)
Celkem 427 hlasů
 Komentářů: 0
Rozcestník
Štítky: není přiřazen žádný štítek

Vložit další komentář
8.6.2017 23:48 Sten
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Nepůsobí -fdata-sections a -ffunction-sections naopak zvětšení binárky, když má každá funkce svou sekci, která je uvedena ve výsledkem souboru, nebo ty sekce linker nakonec spojí do jedné?
limit_false avatar 9.6.2017 00:28 limit_false | skóre: 23 | blog: limit_false
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Ze zkušenosti ne. Když se na ty symboly dívám, tak akorát vyžadují zarování na 32-bit hranici, ale to potřebovali i předtím. Ten trik se sekcemi jen jenom hack na linker.

Zřejmě každý typ sekce má jiný alignment. Tyhle .text.symbol se mi zarovnávají na 4 bajty, .text sekce celá na 16 bajtů. Aktuální objdump dokonce ukazuje i "fill" (nepoužité bajty kvůli zarovnání).

Zřejmě víc by bylo vidět z linker scriptu.
When people want prime order group, give them prime order group.
limit_false avatar 9.6.2017 01:16 limit_false | skóre: 23 | blog: limit_false
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Manuál gcc má taky zmínku o zvětšení object fajlu, ale když to zkouším, tak mi to vychází opačně - zmenší se.

V mém případě (kvůli kterému jsem tohle řešil) jenom ty dva flagy ořezali z cca 35 MB ARM binárky asi 2.5 MB.

S -Wl,-verbose lze vypsat aktuální linker script, ale zatím jsem z toho nevyčetl podstatní rozdíl.
When people want prime order group, give them prime order group.
9.6.2017 01:37 pc2005 | skóre: 37 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Zkoušels i -fwhole-program a zda nějak zmenší binárku?
limit_false avatar 9.6.2017 12:13 limit_false | skóre: 23 | blog: limit_false
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Vyzkoušel jsem to, ale nemá to žádný efekt.
When people want prime order group, give them prime order group.
9.6.2017 15:46 iptriz | skóre: 1 | blog: twktms
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Výborně, něco takového jsem před pár dny řešil (jen s řádově menší binárkou), akorát by to chtělo ještě ten kumulativní výpočet velikosti symbolů, no snad mi to moc nepotrvá. Kdyby se mezitím někomu nelíbil sed/awk, tohle se tváří funkčně ekvivalentně...
objdump -d "$1" | perl -lne 'if(/<([^+]*).*?>(:?)/){if($2){$w=$1}elsif($w ne$1){print"$w $1"}}' | sort -u
9.6.2017 17:49 iptriz | skóre: 1 | blog: twktms
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Tak bohužel se ukázalo, že to moc nefunguje – když jdu grafem od mainu, posbírám jen 1/3 velikosti programu. Ověřil jsem si, že to je problém v objdump, kde minimálně jedna funkce nemá jiný odkaz než sama na sebe. Nějaké nápady, co s tím?
#!/bin/sh
objdump -d "$1" | perl -lne 'next unless/<([^+]*).*?>(:?)/;
	if($2){$w=$1}elsif($w ne$1){print"$w $1"}' | sort -u > deps

nm --synthetic --print-size --size-sort --radix=d "$1" | awk '
	function collect(name, set,  i) {
		used[name]++
		if (set[name]++)
			return
		for (i = 0; i < deps[name]; i++)
			collect(deps[name, i], set)
	}
	function run(name,  set, sum, i) {
		set[name] = sum = 0
		collect(name, set)
		for (i in set) sum += sizes[i]
		print name, sizes[name], sum
	}
	{ sizes[$4] = $2 + 0 } END {
		while ((getline < "deps") > 0) { deps[$1, deps[$1]++] = $2 }
		for (name in sizes) run(name)
		for (name in used) if (used[name] < 2) print name > "unreferenced"
	}' | sort -nk3
9.6.2017 18:00 iptriz | skóre: 1 | blog: twktms
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
000000000041865f <my_funny_callback>:
  41865f:       55                      push   %rbp
[...]
  418739:       be 5f 86 41 00          mov    $0x41865f,%esi
Vypadá to, že to bude chtít mnohem víc Perlu.
9.6.2017 18:25 iptriz | skóre: 1 | blog: twktms
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Abych z toho udělal nějaký závěr:
  • objdump neresolvuje callbacky předávané argumentem – lze vyřešit
  • objdump neresolvuje callbacky z dat – nelze vyřešit
Tedy vždy to bude pouze orientační, každopádně velmi rychlé a jednoduché.
limit_false avatar 10.6.2017 01:18 limit_false | skóre: 23 | blog: limit_false
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Jop, čekal jsem něco podobného. objdump někdy resolvuje parametry předáváné odkazem (původně jsem třeba podezříval pthread_create za skrývání symbolů) a někdy resolvuje callbacky z dat (nevím nakolik je tolerantní na zanořené reference).

Každopádně mi to přijde jako zajímavý problém, kterého řešení by mohlo zajímat i někoho jiného. Linker (GNU ld) všechny potřebné informace má, otázka zní, jak to z něj dostat?

Nějaký tip kam se zeptat? Našel jsem binutils mailing-list, ale nevím zda je to vhodný mailinglist (plus nevidím způsob jak se subscribnout).
When people want prime order group, give them prime order group.
10.6.2017 03:22 pc2005 | skóre: 37 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Co když mám pole callbacků (a generuju adresu přes nějakej index)? O tom snad linker nemůže vědět ne?

Je nutné se subscribovat? Já když posílám patche do kernelu, tak jen pošlu mail na mailing list z MAINTAINERS. V nejhorším ti přijde mail ať pošleš subscribe majordom botovi. Takže bych jen poslal mail na binutils at sourceware dot org (okopírované z jednoho mailu) a hotovo :-D.
limit_false avatar 10.6.2017 21:13 limit_false | skóre: 23 | blog: limit_false
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Úplně nerozumím, jaký je problém s polem callbacků. Linker prostě musí vzít všechny symboly, které jsou referencované a doplnit je do binárky buď kopírovaním nebo jako UNDEFINED odkaz.
When people want prime order group, give them prime order group.
11.6.2017 00:21 pc2005 | skóre: 37 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Jo on ten callback bude vlastně někde přiřazenej a to udělá referenci :-/.
10.6.2017 03:15 pc2005 | skóre: 37 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
10.6.2017 15:56 iptriz | skóre: 1 | blog: twktms
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Víc Perlu vypadá takto:
objdump -d "$1" | perl -lne '
	if (/^0*([\da-f]+) <(.+?)>:/) { $a{$1} = $w = $2
	} elsif (/<([^+]*).*?>/) { print "$w $1" if $w ne $1
	} elsif (/0x([\da-f]+),/) { push @{$deps{$w}}, $1
	} END { while (my ($w, $refs) = each %deps) {
		for (@$refs) { print "$w $a{$_}" if exists $a{$_} }
	}}' | sort -u > deps
Skóre: main vzrostl z 26.1% na 35.6% velikosti sstripnuté binárky. _start začal být větší než main. Konkrétní program obsahuje callbacky v datech s nemalým podstromem.
10.6.2017 16:22 iptriz | skóre: 1 | blog: twktms
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Drobnou úpravou se dostáváme k 21.8% → 51.7% sstripnutého release buildu:
objdump -d "$1" | perl -lne '
	if (/^0*([\da-f]+) <(.+?)>:/) { $a{$1} = $w = $2; next }
	print "$w $1" if /<([^+]*).*?>/ && $w ne $1;
	push @{$deps{$w}}, $1 if /0x([\da-f]+),/;
	END { while (my ($w, $refs) = each %deps) {
		for (@$refs) { print "$w $a{$_}" if exists $a{$_} }
	}}' | sort -u > deps
10.6.2017 17:42 iptriz | skóre: 1 | blog: twktms
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Ještě jde resolvnout pár zbylých odkazů na data a zde asi definitivně končím:
nm "$1" | perl -lne 'print for /^0*(\S+) . (\S+)/' > addresses
objdump -d "$1" | perl -lne '
	if (/<([^+]*).*?>(:?)/) { $w = $1 if $2; print "$w $1" if $w ne $1 }
	BEGIN { %a = (split " ", `cat addresses`) }
	print "$w $a{$1}" if /0x([\da-f]+),/ && exists $a{$1}' | sort -u > deps
Další krok je omílaný linker nebo potenciálně DWARF.
12.6.2017 01:04 iptriz | skóre: 1 | blog: twktms
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Mimovolně jsem ještě došel k tomu, že ty informace jdou vytahat z object souborů, přes objdump -x. Člověk si ze "symbol table" posbírá offsety a velikosti a pak projíždí "relocation records" a zpětně resolvuje. Object soubory jenom už může být trochu problém posbírat, možná přes nějaký falešný kompilátor/linker jak to dělá scan-build analyzátor, ccache a podobné, a pořád to nemusí být triviální (více object files na jedny zdrojáky s různými defines), tak možná počkat na finální link příkaz do binárky a poprat se i s .a soubory. Teoreticky by se to dalo sledovat i přes strace/ptrace místo wrapperů.
12.6.2017 01:09 iptriz | skóre: 1 | blog: twktms
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Ono to jde vytahat i z toho output.map souboru ze sekce "Linker script and memory map", řádky LOAD s názvy souborů se dají docela snadno vyparsovat. Problém je, když se linkuje víc věcí, pak se ty output.map přepisují.
limit_false avatar 10.6.2017 03:14 limit_false | skóre: 23 | blog: limit_false
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
Celkem bych se mi hodil nějaký krátký příklad, na kterém se to projevuje. (Plus compile a link flagy).
When people want prime order group, give them prime order group.
10.6.2017 03:42 pc2005 | skóre: 37 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
BTW o co že takhle diskuze nakonec skončí u analýzy pomocí spuštění v QEMU :-D.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.