LINUX.ORG.RU

Олимпиадка в честь 1 апреля

 , ,


1

5

Вывести на экран строку «Hello, world»; получить статически собранный исполняемый файл.

GNU Assembler:


str: .ascii "Hello, world\n"

.global main
main:
	mov $1, %rax
	mov $1, %rdi
	mov $13, %rdx
	mov $str, %rsi
	syscall
	mov $0, %rdi
	mov $60, %rax
	syscall

$ as -o hello.o hello.s 
$ ld -e main -o hello hello.o 
$ strip hello
$ ll hello
-rwxrwxr-x 1 me me 392 апр.   1 20:08 hello*

Deleted

Я выиграл?

$ cat helloworld.cpp
#include <iostream>

int main(int argc, char** argv)
{
        std::cout << "Hello, world" << std::endl;
}
$ g++ --static helloworld.cpp -o helloworld
$ ./helloworld.exe
Hello, world
$ ls -l helloworld.exe
-rwxr-xr-x 1 - - 1883906 апр  1 21:06 helloworld.exe
$ uname -a
MINGW64_NT-6.1 - 2.1.0(0.287/5/3) 2015-03-17 14:33 x86_64 Msys

anonymous ()
$ uname -rm
3.16.0-gentoo x86_64
$ cat - > hello.s
BITS 32
    org 0x05000000
    db  0x7F, "ELF"
    dd  1
    dd  0
    dd  $$
    dw  2
    dw  3
    dd  0x0500001B
    dd  0x0500001B
    dd  4
    mov dl, 13
    mov ecx, msg
    int 0x80
    db  0x25
    dw  0x20
    dw  0x01
    inc eax
    int 0x80
msg db  'Hello, world', 10
$ nasm -f bin -o hello hello.s
$ chmod +x hello
$ ls -l hello
-rwxr-xr-x 1 mix_mix mix_mix 62 Apr  1 21:10 hello
$ $ ./hello
Hello, world
mix_mix ★★★★★ ()

Objective Caml:

print_string "Hello, World!\n"
~ % ocamlopt.opt -compact -o hello -linkall hello.ml
~ % ls -l hello
-rwxrwxr-x 1 user user 907784 апр.   1 23:32 hello
~ % ldd hello
	linux-vdso.so.1 =>  (0x00007ffee5d68000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f64a06ee000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f64a04ea000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f64a011f000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f64a0a27000)

olibjerd ★★★★★ ()
Последнее исправление: olibjerd (всего исправлений: 1)

получить статически собранный исполняемый файл.

Это не путь лиспера

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

С чего ей быть?

$ ldd helloworld.exe
        ntdll.dll => /c/windows/SYSTEM32/ntdll.dll (0x77280000)
        kernel32.dll => /c/windows/system32/kernel32.dll (0x77160000)
        KERNELBASE.dll => /c/windows/system32/KERNELBASE.dll (0x7fefd090000)
        msvcrt.dll => /c/windows/system32/msvcrt.dll (0x7feff4e0000)
Под оффтопиком статичнее некуда.

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

А вот это уже странно:

~ % ocamlopt.opt -compact -o hello hello.ml
~ % ls -l hello
-rwxrwxr-x 1 user user 189392 апр.   1 23:14 hello
~ % ldd hello
	linux-vdso.so.1 =>  (0x00007fff8daf0000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd90d130000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd90cf2c000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd90cb61000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fd90d469000)

olibjerd ★★★★★ ()
package main

import "fmt"

func main() {
	fmt.Println("Hello, world")
}
$ go build hello.go
$ ls -l hello
-rwxr-xr-x 1 mix_mix mix_mix 1823520 Apr  1 21:15 hello
$ ldd ./hello
	not a dynamic executable
$ file ./hello
./hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
mix_mix ★★★★★ ()
Ответ на: комментарий от mix_mix

Можно и короче:

package main

func main() {
        print("hello world\n")
}

beastie ★★★★★ ()
Ответ на: комментарий от mix_mix
begin
	writeln('Hello, world');
end.
$ fpc -Os -XS -Xs -Xt hello.pas 
Free Pascal Compiler version 2.4.4-3.1 [2012/01/04] for x86_64
Copyright (c) 1993-2010 by Florian Klaempfl
Target OS: Linux for x86-64
Compiling hello.pas
Linking hello
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
2 lines compiled, 0.1 sec 
$ ldd hello
	не является динамическим исполняемым файлом
$ ll hello
-rwxrwxr-x 1 me me 150824 апр.   1 21:25 hello*
Deleted ()
Ответ на: комментарий от olibjerd

Ну обычно языки, опирающиеся на сишку, и не задумываются о статической линковке, наверное.

Deleted ()
#lang racket/base
(printf "Hello world\n")
% raco exe hw.rkt 
% ldd hw  
        linux-vdso.so.1 (0x00007ffff7ae9000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fee8c987000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fee8c5de000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fee8cbcb000)
% ./hw 
Hello world

Прямо static вроде не умеет, отсос :(

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

Я почему-то думал, что ракетка вообще ниумеет в конпеляцию.

Deleted ()
$>ls -l
total 96
-rwxrwxr-x 1 asd asd 93332 Mar 11 20:22 fasm
-rw-rw-r-- 1 asd asd   238 Apr  1 23:03 hello.asm
$>cat hello.asm 
format ELF executable 3
entry start
segment readable executable
start:
        mov     eax,4
        mov     ebx,1
        mov     ecx,msg
        mov     edx,msg_size
        int     0x80
        mov     eax,1
        xor     ebx,ebx
        int     0x80
segment readable writeable
msg db 'Hello world!',0xA
msg_size = $-msg
$>./fasm hello.asm 
flat assembler  version 1.71.39  (16384 kilobytes memory)
3 passes, 160 bytes.
$>ls -l
total 100
-rwxrwxr-x 1 asd asd 93332 Mar 11 20:22 fasm
-rwxr-xr-x 1 asd asd   160 Apr  1 23:07 hello
-rw-rw-r-- 1 asd asd   238 Apr  1 23:03 hello.asm
$>./hello 
Hello world!
$>
q11q11 ★★★★★ ()

dale!

(import cstdio)                                                                                                       
                                                                                                                      
(def main (fn extern-c int (void)
  (printf "Hello, world\n")))
$ dalec --no-dale-stdlib -o hello hello.dt
$ ldd hello
        linux-gate.so.1 =>  (0xb77b3000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75d6000)
        /lib/ld-linux.so.2 (0xb77b4000)
$ ./hello 
Hello, world
$ ll hello
-rwxrwxr-x 1 me me 7184 апр.   1 23:01 hello*

Системнинько.

Но...

$ dalec -s bc -o hello.bc hello.dt 
$ clang -static hello.bc -o hello
warning: overriding the module target triple with i386-pc-linux-gnu
1 warning generated.
$ ./hello 
Hello, world
$ ldd hello
        не является динамическим исполняемым файлом
$ ll hello
-rwxrwxr-x 1 me me 737317 апр.   1 23:04 hello*

А где rust?

Kuzy ★★★ ()
Ответ на: dale! от Kuzy

В альфе! (закадровый смех)

Deleted ()

Ну, такое, попса:

/tmp $ cat hello.c 
main() { puts("hello, world!"); }

/tmp $ gcc -static -Os hello.c -o hello

/tmp $ strip hello

/tmp $ ldd hello
        не є динамічним виконуваним файлом

/tmp $ du -hs hello
792K    hello

/tmp $ ./hello 
hello, world!

KennyMinigun ★★★★★ ()
Последнее исправление: KennyMinigun (всего исправлений: 2)

Под оффтопиком

$ cat hello_world.rs
fn main() {
        println!("Hello world!");
}
$ rustc hello_world.rs
$ ./hello_world.exe
Hello world!
$ ls -l hello_world.exe
-rwxr-xr-x 1 - - 3162657 апр  1 23:59 hello_world.exe
$ ldd hello_world.exe
        ntdll.dll => /c/windows/SYSTEM32/ntdll.dll (0x77280000)
        kernel32.dll => /c/windows/system32/kernel32.dll (0x77160000)
        KERNELBASE.dll => /c/windows/system32/KERNELBASE.dll (0x7fefd090000)
        ADVAPI32.dll => /c/windows/system32/ADVAPI32.dll (0x7fefd530000)
        msvcrt.dll => /c/windows/system32/msvcrt.dll (0x7feff4e0000)
        sechost.dll => /c/windows/SYSTEM32/sechost.dll (0x7fefe4e0000)
        RPCRT4.dll => /c/windows/system32/RPCRT4.dll (0x7fefd620000)
        SHELL32.dll => /c/windows/system32/SHELL32.dll (0x7fefd750000)
        SHLWAPI.dll => /c/windows/system32/SHLWAPI.dll (0x7fefe500000)
        GDI32.dll => /c/windows/system32/GDI32.dll (0x7feff470000)
        USER32.dll => /c/windows/system32/USER32.dll (0x77060000)
        LPK.dll => /c/windows/system32/LPK.dll (0x7fefd610000)
        USP10.dll => /c/windows/system32/USP10.dll (0x7fefee60000)
        USERENV.dll => /c/windows/system32/USERENV.dll (0x7fefd070000)
        profapi.dll => /c/windows/system32/profapi.dll (0x7fefd050000)
        WS2_32.dll => /c/windows/system32/WS2_32.dll (0x7fefee10000)
        NSI.dll => /c/windows/system32/NSI.dll (0x7feff580000)
        IMM32.DLL => /c/windows/system32/IMM32.DLL (0x7fefe800000)
        MSCTF.dll => /c/windows/system32/MSCTF.dll (0x7fefd420000)
        nvinitx.dll => /c/windows/system32/nvinitx.dll (0x7fefcf70000)
        VERSION.dll => /c/windows/system32/VERSION.dll (0x7fefcf60000)
        igdumd64.dll => /c/windows/system32/NV/igdumd64.dll (0x7fef3240000)
        SETUPAPI.dll => /c/windows/system32/SETUPAPI.dll (0x7fefe620000)
        CFGMGR32.dll => /c/windows/system32/CFGMGR32.dll (0x7fefd3b0000)
        OLEAUT32.dll => /c/windows/system32/OLEAUT32.dll (0x7fefef30000)
        ole32.dll => /c/windows/system32/ole32.dll (0x7fefec00000)
        DEVOBJ.dll => /c/windows/system32/DEVOBJ.dll (0x7fefd140000)
        igd10umd64.dll => /c/windows/system32/NV/igd10umd64.dll (0x7fef3cb0000)
$ rustc --version
rustc 1.0.0-nightly (d754722a0 2015-03-31) (built 2015-04-01)

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

Под онтопиком

$ cat hello_world.rs
fn main() {
	println!("Hello world!");
}
$ rustc hello_world.rs
$ ls -l hello_world
-rwxr-xr-x 1 - users 430664 апр  2 00:10 hello_world
$ strip --strip-all hello_world
$ ls -l hello_world
-rwxr-xr-x 1 - users 344456 апр  2 00:11 hello_world
$ ldd hello_world
	linux-vdso.so.1 (0x00007fff73bc5000)
	libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f275c1ae000)
	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f275bf91000)
	librt.so.1 => /usr/lib/librt.so.1 (0x00007f275bd89000)
	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f275bb73000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007f275b7d0000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f275c3b2000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007f275b4cb000)
$ rustc --version
rustc 1.0.0-dev (built 2015-02-23)

anonymous ()
SEG=0x07C0
.code16
.text
.globl _start
_start:
jmp $SEG, $start

msg: .asciz "Hello World!"

start:

mov %cs, %ax
mov %ax, %ds
mov %ax, %es

lea msg, %si
print:
lodsb
cmp $0, %al
je hang
mov $0x0e, %ah
mov $7, %bx
int $0x10
jmp print

hang:
jmp hang
.org 510
.word 0xAA55

.end

Шесть лет назад это работало в bochs, сейчас почему-то ничего не выводит. Не могу понять почему.

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

Ну и чтобы два раза не вставать:

$ cat hello_world.hs
main = putStrLn "Hello World"
$ ghc --make hello_world.hs
[1 of 1] Compiling Main             ( hello_world.hs, hello_world.o )
Linking hello_world ...
$ ./hello_world
Hello World
$ ls -l hello_world
-rwxr-xr-x 1 - users 1132560 апр  2 00:17 hello_world
$ strip --strip-all hello_world
$ ls -l hello_world
-rwxr-xr-x 1 - users 788752 апр  2 00:18 hello_world
$ ldd hello_world
	linux-vdso.so.1 (0x00007ffc3c2a4000)
	libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fd653954000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007fd65364f000)
	librt.so.1 => /usr/lib/librt.so.1 (0x00007fd653447000)
	libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fd653243000)
	libffi.so.6 => /usr/lib/libffi.so.6 (0x00007fd65303a000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007fd652c97000)
	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fd652a7a000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fd653be6000)
или
$ ghc --make -dynamic hello_world.hs
[1 of 1] Compiling Main             ( hello_world.hs, hello_world.o )
Linking hello_world ...
$ ./hello_world
Hello World
$ ls -l hello_world
-rwxr-xr-x 1 - users 16776 апр  2 00:20 hello_world
$ ldd hello_world
	linux-vdso.so.1 (0x00007fff5b1fc000)
	libHSbase-4.7.0.2-ghc7.8.4.so => /usr/lib/ghc-7.8.4/base-4.7.0.2/libHSbase-4.7.0.2-ghc7.8.4.so (0x00007fa942142000)
	libHSinteger-gmp-0.5.1.0-ghc7.8.4.so => /usr/lib/ghc-7.8.4/integer-gmp-0.5.1.0/libHSinteger-gmp-0.5.1.0-ghc7.8.4.so (0x00007fa941f27000)
	libHSghc-prim-0.3.1.0-ghc7.8.4.so => /usr/lib/ghc-7.8.4/ghc-prim-0.3.1.0/libHSghc-prim-0.3.1.0-ghc7.8.4.so (0x00007fa941cab000)
	libHSrts-ghc7.8.4.so => /usr/lib/ghc-7.8.4/rts-1.0/libHSrts-ghc7.8.4.so (0x00007fa941a46000)
	libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fa9417b4000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007fa9414af000)
	librt.so.1 => /usr/lib/librt.so.1 (0x00007fa9412a7000)
	libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fa9410a3000)
	libffi.so.6 => /usr/lib/libffi.so.6 (0x00007fa940e9a000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007fa940af7000)
	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fa9408da000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fa942abc000)

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

Haskell has two types for integer numbers: Int and Integer.

«Integer» is an arbitrary precision type: it will hold any number no matter how big, up to the limit of your machine's memory. That is why «factorial 1000» gives you the right answer. This means you never have arithmetic overflows. On the other hand it also means your arithmetic is relatively slow.

«Int» is the more common 32 or 64 bit integer. Implementations vary, although it is guaranteed to be at least 30 bits.

anonymous ()

Дядя Борман врывается в тред

C:\HELLO>type HELLO.ASM
.model small
.stack 100h
.code
start: mov ax,DGROUP
mov ds,ax
mov dx,offset message
mov ah,9
int 21h
mov ax,4C00h
int 21h
.data
message db "Hello, World!",0Dh,0Ah,'$'
end start

C:\HELLO>tasm HELLO.ASM
Turbo Assembler  Version 4.1  Copyright (c) 1988, 1996 Borland International

Assembling file:   HELLO.ASM
Error messages:    None
Warning messages:  None
Passes:            1
Remaining memory:  468k


C:\HELLO>tlink /x HELLO.OBJ,HELLO.EXE
Turbo Link  Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International

C:\HELLO>HELLO.EXE
Hello, World!

C:\HELLO>dir HELLO.exe
Directory of C:\HELLO\.

HELLO    EXE                560 02-04-2015  1:09
    1 File(s)               560 Bytes.
    0 Dir(s)        262,111,744 Bytes free.
anonymous ()
Ответ на: комментарий от Deleted

запускал в dosbox, а так в принципе да. это .exe, .com по идее ещё меньше будет, но лень разбираться.

anonymous ()

О, надо поучаствовать, а то у вас попса одна:

 ~/dev/red  cat hello.red 
Red [
    Title: "Simple hello world"
]

print "Hello, World!"
 ~/dev/red  red -c hello.red

-=== Red Compiler 0.4.3 ===- 

Compiling /home/maxvel/dev/red/hello.red ...
...compilation time : 280 ms

Compiling to native code...
...compilation time : 13751 ms
...linking time     : 194 ms
...output file size : 345936 bytes
...output file      : /home/maxvel/dev/red/hello

 ~/dev/red  ls -lh hello
-rwxr--r-- 1 maxvel maxvel 338K Apr  2 05:06 hello
 ~/dev/red  ldd hello
        libc.so.6 => /lib32/libc.so.6 (0x4769c000)
        libm.so.6 => /lib32/libm.so.6 (0x4785f000)
        /lib/ld-linux.so.2 (0x47678000)
 ~/dev/red  ./hello 
Hello, World!
loz ★★★★★ ()
Ответ на: комментарий от loz

Ну и нимчик в довесок:

 ~/dev/nim  cat hello.nim 
echo("Hello, World!")
 ~/dev/nim  nim c --noLinking hello.nim
config/nim.cfg(53, 2) Hint: added path: '/home/maxvel/.babel/pkgs/' [Path]
config/nim.cfg(54, 2) Hint: added path: '/home/maxvel/.nimble/pkgs/opengl-1.0' [Path]
config/nim.cfg(54, 2) Hint: added path: '/home/maxvel/.nimble/pkgs/ludens-0.1' [Path]
config/nim.cfg(54, 2) Hint: added path: '/home/maxvel/.nimble/pkgs/nimble-0.6.0' [Path]
config/nim.cfg(54, 2) Hint: added path: '/home/maxvel/.nimble/pkgs/sfml-2.0' [Path]
config/nim.cfg(54, 2) Hint: added path: '/home/maxvel/.nimble/pkgs/x11-1.0' [Path]
config/nim.cfg(54, 2) Hint: added path: '/home/maxvel/.nimble/pkgs/' [Path]
Hint: used config file '/home/maxvel/dev/nim-lang/Nim/config/nim.cfg' [Conf]
Hint: system [Processing]
lib/system.nim(143, 40) Warning: unknown magic 'Addr' might crash the compiler [UnknownMagic]
lib/system.nim(148, 39) Warning: unknown magic 'TypeOf' might crash the compiler [UnknownMagic]
lib/system.nim(231, 62) Warning: unknown magic 'DotDot' might crash the compiler [UnknownMagic]
lib/system.nim(239, 59) Warning: unknown magic 'DotDot' might crash the compiler [UnknownMagic]
lib/system.nim(3246, 44) Warning: unknown magic 'Roof' might crash the compiler [UnknownMagic]
Hint: hello [Processing]
Hint: operation successful (9008 lines compiled; 0.152 sec total; 14.148MB; Debug Build) [SuccessX]
 ~/dev/nim  ls -lh hello
-rwxr-xr-x 1 maxvel maxvel 168K Apr  2 05:09 hello
 ~/dev/nim  ldd hello
        linux-vdso.so.1 (0x00007ffff7ffd000)
        libdl.so.2 => /lib64/libdl.so.2 (0x0000003095200000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003094600000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003094200000)
 ~/dev/nim  ./hello 
Hello, World!

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

Почему? Какой-нибудь ecl или gambit выдадут вполне вменяемый результат, у меня их правда под рукой нет.

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

-rwxr-xr-x 1 mix_mix mix_mix 62 Apr 1 21:10 hello

прелестно

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

Борман, так Борман:

.model tiny
.code
	org	100h
start:
	mov	dx, offset s
	mov	ah, 9
	int	21h
	ret
s	db	'Hello, world',0ah,'$'
	end	start
C:\> tasm a
C:\> tlink /t a
C:\> dir a.com
A        COM                 22 02-04-2015  9:52
    1 File(s)                22 Bytes.
C:\> a.com
Hello, world

bormant ★★★★★ ()

Если строку не переводить, на байт короче, 21. Такой вот DOS ;-)

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

А я как-то стянул 5.1, он упал пытаясь скомпилить репл. Сейчас обновил, он на hello world выдал бинарник большего размера, лол.

loz ★★★★★ ()

C + rt0

$ cat t/hello.c
#include <rt0/syscall.h>

int main( int argc, char **argv, char **envp )
{
   syscall3( SYS_write, 1, ( long )( "Hello World!\n" ), 13 );

   return 0;
}
$ make t/hello.exe
cc -Os -nostdlib -fomit-frame-pointer -Iinclude -c t/hello.c -o t/hello.o
cc t/hello.o -Llib -lrt0 -Os -nostdlib -fomit-frame-pointer -s -o t/hello.exe
$ ./t/hello.exe 
Hello World!
$ du -b t/hello.exe
1360	t/hello.exe
NeXTSTEP ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.