GNU/Linux >> Linux の 問題 >  >> Linux

C ランタイム ライブラリを 'ld' とリンクするには?

atoi のような単純なライブラリ関数を呼び出したい場合 、それでも C ランタイムの使用は避けてください。そうすることができます。 (つまり、 _start と書きます 、単に main を書くのではなく 一連の定型コードが実行された後に呼び出されます。)

gcc -o swap -nostartfiles swap.o

人々がコメントで言っているように、glibc の一部は、標準の起動ファイルから実行されるコンストラクター/デストラクタに依存しています。おそらく、これは stdio (puts/printf/scanf/getchar) の場合であり、malloc の場合もあります。ただし、多くの関数は、与えられた入力を処理するだけの「純粋な」関数です。 sprintf/sscanf 使用しても問題ないかもしれません。

例:

$ cat >exit64.asm  <<EOF
section .text

extern exit

global _start
_start:

    xor edi, edi
    jmp exit            ; doesn't return, so optimize like a tail-call

    ;; or make the syscall directly, if the jmp is commented
    mov eax, 231    ;  exit(0)
    syscall

;   movl eax, 1     ; 32bit call
;   int 0x80
EOF

$ yasm -felf64 exit64.asm && gcc -nostartfiles exit64.o -o exit64-dynamic
$ nm exit64-dynamic
0000000000601020 D __bss_start
0000000000600ec0 d _DYNAMIC
0000000000601020 D _edata
0000000000601020 D _end
                 U [email protected]@GLIBC_2.2.5
0000000000601000 d _GLOBAL_OFFSET_TABLE_
00000000004002d0 T _start
$ ltrace ./exit64-dynamic 
enable_breakpoint pid=11334, addr=0x1, symbol=(null): Input/output error
exit(0 <no return ...>
+++ exited (status 0) +++
$ strace ... # shows the usual system calls by the runtime dynamic linker

libc を使用した例を次に示します。 GCC を使用せずに。

extern printf
extern _exit

section .data
    hello:     db 'Hello world!',10

section .text
    global _start   
_start:
    xor eax, eax
    mov edi, hello
    call printf
    mov rax, 0    
    jmp _exit

次のようにコンパイルしてリンクします:

nasm -f elf64 hello.asm
ld hello.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc -m elf_x86_64

これは今のところ問題なく機能していますが、静的リンケージの場合は複雑です。


Linux
  1. findコマンドを使用して権限を監査する方法

  2. Kali は今後の Python 2 のサポート終了にどのように対処するか

  3. 破損したライブラリを yum で再インストールする方法

  1. 指定された共有ライブラリがデバッグ シンボルでビルドされているかどうかを知る方法は?

  2. 古いバージョンの共有ライブラリにリンクするにはどうすればよいですか

  3. wgetで最新のAnacondaをインストールするにはどうすればよいですか

  1. Linux で .so ファイルを java.library.path に追加する方法

  2. 「tar」コマンドと「find」コマンドを組み合わせる方法

  3. バックアップのあるディスクの磁気状態を更新するにはどうすればよいですか?