LINUX.ORG.RU

Не получается слинковать вручную объектный файл, созданный ассемблером as


0

1

Товарищи, есть .s файл такого вида:

.section .rodata
.LC0:
.string «Hi!»
.text
.globl _start
.type main, @function
_start:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, (%esp)
call puts
movl $0, %eax
leave
ret
.size main, .-main
.section .note.GNU-stack,"",@progbits

Далее делаю следующее:

1. > as hello.s -o hello.o
2. > ld -lc -s -o hello hello.o
3. > ./hello
./hello: Command not found.

В чём я не прав? Самое интересное:

strace ./hello

execve("./hello", ["./hello"], [/* 24 vars */]) = -1 ENOEXEC (Exec format error)
dup(2) = 3
fcntl64(3, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat64(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 5), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78ac000
_llseek(3, 0, 0xbf9fe944, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(3, «strace: exec: Exec format error\n», 32strace: exec: Exec format error
) = 32
close(3) = 0
munmap(0xb78ac000, 4096) = 0
exit_group(1) = ?

as hello.s -o hello.o
hello.s: Assembler messages:
hello.s:18: Error: .size expression for main does not evaluate to a constant

ЧЯДНТ? ;)
скопипастил весь .s-file

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

так подскажи по делу, (мужской-половой-орган)-ле!

aol ★★★★★
()

разбирайся

Makefile:

CRT1 = /usr/lib/x86_64-linux-gnu/crt1.o
CRTI = /usr/lib/x86_64-linux-gnu/crti.o
CRTN = /usr/lib/x86_64-linux-gnu/crtn.o
LD_LINUX = /lib64/ld-linux-x86-64.so.2

NOWEB = book.nw
TEX = ${NOWEB:.nw=.tex}
BOOK = ${NOWEB:.nw=.pdf}

SRC = bf.s
OBJ = ${SRC:.s=.o}
BIN = ${SRC:.s=}

WEAVE = noweave -x -delay -latex
TANGLE = notangle
TEX2PDF = xelatex
AS = as
LD = ld -dynamic-linker $(LD_LINUX) $(CRT1) $(CRTI) $(1) -lc $(CRTN)

all: $(BOOK) $(BIN)
book: $(BOOK)
bin: $(BIN)

$(TEX): $(NOWEB)
        $(WEAVE) $(NOWEB) > $(TEX)

$(BOOK): $(TEX)
        $(TEX2PDF) $(TEX)
        $(TEX2PDF) $(TEX)

$(SRC): $(NOWEB)
        $(TANGLE) $(NOWEB) > $(SRC)

$(OBJ): $(SRC)
        $(AS) $(SRC) -o $(OBJ)

$(BIN): $(OBJ)
        $(call LD, $(OBJ) -o $(BIN))

.PHONY: clean
clean:
        find -maxdepth 1 -type f ! \( -name book.nw -or -name Makefile \) -delete
bf.s:
.data
  ...
.section .rodata
  ...
.text
.globl main
main:
  pushq %rbp
  movq  %rsp, %rbp
  ...
  leave

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

Не копипащу. Сорец получил из gcc, компилируя с опцией -s. main поменял на _start (для ld, говорят, надо). Но сути это не менеяет - .size поправил - результат тот же...

bff7755a
() автор топика
Ответ на: разбирайся от kermzyxer

А вообще, предлагаю тебе использовать 2 команды:
gcc -S foo.c — получить asm-листинг файла foo.c
gcc foo.s — получить бинарник из файла foo.s

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

> Сорец получил из gcc
В нем как раз таки много «сорца». Смотри выше, какой у меня bf.s чистый.

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

Суть как раз в том, что я таки хочу использовать ассемблер и линковщик из binutils. И разобраться, как он работают :).

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

> Суть как раз в том, что я таки хочу использовать ассемблер и линковщик из binutils.
В make-файле выше, я как раз напрямую вызывал линковщик и ассемблер. Я использовал glibc, как писать без нее — легко нагуглить. Если будешь использовать glibc, придется разбираться с ABI.

И разобраться, как он работают :).

gcc -v foo.c — gcc будет выводить на экран все свои действия.
http://www.iecc.com/linker/
http://www.sco.com/developers/devspecs/

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