В чем разница между исполняемым и перемещаемым в формате elf?

В чем разница между исполняемым файлом в формате elf и перемещаемым файлом в формате elf?

elf
12 голосов | спросил Rimon Fedyuk 9 J000000Wednesday14 2014, 18:03:19

3 ответа


0

Как видно на рисунке ниже, перемещаемый ELF служит входом для компоновщика, тогда как исполняемый ELF является продуктом компоновщика.

Пример схемы инструментов разработки Freescale SC100

ответил Eugeniu Rosca 7 Jpm1000000pmWed, 07 Jan 2015 21:07:44 +030015 2015, 21:07:44
0

Исполняемый файл ELF, как мы можем понять из его названия, - это файл, который может быть выполнен. Этот файл может быть сгенерирован из кода C, например.

Процесс перемещения фиксирует адреса меток и символов, которые были созданы в коде. Например, если вы пишете программу на языке ассемблера и смотрите файл листинга вашего исходного кода, вы найдете несколько мест, где написано [00000000] вместо метки, упомянутой в этой строке. Это означает, что компоновщик использует перемещение, чтобы зафиксировать адрес в его будущем значении.

ответил Mickey 9 J000000Wednesday14 2014, 18:55:16
0

как вы знаете, каждый скомпилированный исполняемый файл является двоичным файлом с относительным и абсолютным адресом, поэтому перемещаемый формат - это формат, в котором функция и другие символы все еще имеют определение имен в других функциях слова, а переменные не привязаны к какому-либо конкретному адресу , Вместо этого адреса все еще являются символами

смотри:

 unix > gcc -c main.c
unix > readelf --symbols main.o
Num:     Value   Size     Type      Bind       Vis     Ndx  Name
  0:  00000000      0   NOTYPE     LOCAL   DEFAULT     UND
  1:  00000000      0   FILE       LOCAL   DEFAULT     ABS  main.c
  2:  00000000      0   OBJECT    GLOBAL   DEFAULT     3    buf
  3:  00000000      0   OBJECT    GLOBAL   DEFAULT     1    main

unix > gcc main.c -o main
unix > readelf --symbols main
Num:     Value   Size     Type      Bind       Vis     Ndx  Name
 53:  08048460      2     FUNC    GLOBAL   DEFAULT     13   __libc_csu_fini
 54:  08048462      0     FUNC    GLOBAL   HIDDEN      13   __i686.get_pc_thunk.bx
 55:  0804a018      4     OBJECT  GLOBAL   DEFAULT     13   bufp0

вы понимаете, о чем я говорю

большую часть времени мы используем их как статическую библиотеку

посмотрите на пример здесь:

 #ifndef MATH_H
#define MATH_H
int add(int a, int b);
#endif

/* math_test.c */
#include <stdio.h>
#include "math.h"

int main(void)
{
  int result = add(1, 2);
  printf("result: %d\n", result);
  return 0;
}

попробуйте скомпилировать его

unix > gcc math_test.c -o math_test
/tmp/cclRibQq.o: In function `main':
math_test.c:(.text+0x19): undefined reference to `add'
collect2: ld returned 1 exit status

что из-за функции add нет тела в math_test.c, чтобы мы могли сделать это:

 int add(int a, int b)
{
  return a + b;
}

затем скомпилируйте его как перемещаемый, используя gcc

unix > gcc -c math.c                      # Create relocatable obj file (math.o)
unix > readelf -h math.o | grep Type      # Read math.o with readelf
Type:            REL (Relocatable file)   # and verify its type

тогда вы можете связать его с компоновщиком следующим образом:

unix > gcc math_test.c math.o -o math_test
unix > ./math_test
result: 3

Отличную статью о разнице между исполняемым файлом в формате elf и перемещаемым файлом в формате elf вы можете найти в здесь

ответил robert 13 MaramTue, 13 Mar 2018 08:09:37 +03002018-03-13T08:09:37+03:0008 2018, 08:09:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132