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í
×
    dnes 13:33 | Komunita

    Dle analytics.usa.gov je za posledních 90 dnů 6,2 % přístupů k webových stránkám a aplikacím federální vlády Spojených států z Linuxu.

    Ladislav Hagara | Komentářů: 0
    včera 17:44 | Zajímavý článek

    Jak si zobrazit pomocí Chrome a na Chromiu založených webových prohlížečích stránky s neplatným certifikátem? Stačí napsat thisisunsafe.

    Ladislav Hagara | Komentářů: 3
    včera 00:33 | Bezpečnostní upozornění

    V repozitáři AUR (Arch User Repository) linuxové distribuce Arch Linux byly nalezeny a odstraněny tři balíčky s malwarem. Jedná se o librewolf-fix-bin, firefox-patch-bin a zen-browser-patched-bin.

    Ladislav Hagara | Komentářů: 11
    včera 00:22 | Komunita

    Dle plánu by Debian 13 s kódovým názvem Trixie měl vyjít v sobotu 9. srpna.

    Ladislav Hagara | Komentářů: 0
    19.7. 13:22 | Komunita

    Vývoj linuxové distribuce Clear Linux (Wikipedie) vyvíjené společností Intel a optimalizováné pro jejich procesory byl oficiálně ukončen.

    Ladislav Hagara | Komentářů: 1
    18.7. 14:00 | Zajímavý článek

    Byl publikován aktuální přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie).

    Ladislav Hagara | Komentářů: 0
    18.7. 12:00 | Nová verze

    V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Forgejo byla vydána ve verzi 12.0 (Mastodon). Forgejo je fork Gitei.

    Ladislav Hagara | Komentářů: 1
    17.7. 18:44 | Zajímavý článek

    Nová čísla časopisů od nakladatelství Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 155 (pdf) a Hello World 27 (pdf).

    Ladislav Hagara | Komentářů: 1
    17.7. 16:11 | Nová verze

    Hyprland, tj. kompozitor pro Wayland zaměřený na dláždění okny a zároveň grafické efekty, byl vydán ve verzi 0.50.0. Podrobný přehled novinek na GitHubu.

    Ladislav Hagara | Komentářů: 4
    17.7. 15:55 | Komunita

    Patrick Volkerding oznámil před dvaatřiceti lety vydání Slackware Linuxu 1.00. Slackware Linux byl tenkrát k dispozici na 3,5 palcových disketách. Základní systém byl na 13 disketách. Kdo chtěl grafiku, potřeboval dalších 11 disket. Slackware Linux 1.00 byl postaven na Linuxu .99pl11 Alpha, libc 4.4.1, g++ 2.4.5 a XFree86 1.3.

    Ladislav Hagara | Komentářů: 6
    Kolik tabů máte standardně otevřeno ve web prohlížeči?
     (27%)
     (18%)
     (5%)
     (7%)
     (2%)
     (5%)
     (5%)
     (32%)
    Celkem 44 hlasů
     Komentářů: 7, poslední dnes 12:44
    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: 38 | 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: 38 | 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: 38 | 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: 38 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Analýza ELF binárky - jak ji oholit o přebytečné bajty
    Jo callbacky jsou zlo!
    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: 38 | 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.