llvm-project

Форк
0
97 строк · 3.1 Кб
1
/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\
2
|*                                                                            *|
3
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
4
|* Exceptions.                                                                *|
5
|* See https://llvm.org/LICENSE.txt for license information.                  *|
6
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
7
|*                                                                            *|
8
|*===----------------------------------------------------------------------===*|
9
|*                                                                            *|
10
|* This file implements the --object-list-sections and --object-list-symbols  *|
11
|* commands in llvm-c-test.                                                   *|
12
|*                                                                            *|
13
\*===----------------------------------------------------------------------===*/
14

15
#include "llvm-c-test.h"
16
#include "llvm-c/Object.h"
17
#include <stdio.h>
18
#include <stdlib.h>
19

20
int llvm_object_list_sections(void) {
21
  LLVMMemoryBufferRef MB;
22
  LLVMBinaryRef O;
23
  LLVMSectionIteratorRef sect;
24

25
  char *outBufferErr = NULL;
26
  if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) {
27
    fprintf(stderr, "Error reading file: %s\n", outBufferErr);
28
    free(outBufferErr);
29
    exit(1);
30
  }
31

32
  char *outBinaryErr = NULL;
33
  O = LLVMCreateBinary(MB, LLVMGetGlobalContext(), &outBinaryErr);
34
  if (!O || outBinaryErr) {
35
    fprintf(stderr, "Error reading object: %s\n", outBinaryErr);
36
    free(outBinaryErr);
37
    exit(1);
38
  }
39

40
  sect = LLVMObjectFileCopySectionIterator(O);
41
  while (sect && !LLVMObjectFileIsSectionIteratorAtEnd(O, sect)) {
42
    printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect),
43
           LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect));
44

45
    LLVMMoveToNextSection(sect);
46
  }
47

48
  LLVMDisposeSectionIterator(sect);
49

50
  LLVMDisposeBinary(O);
51

52
  LLVMDisposeMemoryBuffer(MB);
53

54
  return 0;
55
}
56

57
int llvm_object_list_symbols(void) {
58
  LLVMMemoryBufferRef MB;
59
  LLVMBinaryRef O;
60
  LLVMSectionIteratorRef sect;
61
  LLVMSymbolIteratorRef sym;
62

63
  char *outBufferErr = NULL;
64
  if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) {
65
    fprintf(stderr, "Error reading file: %s\n", outBufferErr);
66
    free(outBufferErr);
67
    exit(1);
68
  }
69

70
  char *outBinaryErr = NULL;
71
  O = LLVMCreateBinary(MB, LLVMGetGlobalContext(), &outBinaryErr);
72
  if (!O || outBinaryErr) {
73
    fprintf(stderr, "Error reading object: %s\n", outBinaryErr);
74
    free(outBinaryErr);
75
    exit(1);
76
  }
77

78
  sect = LLVMObjectFileCopySectionIterator(O);
79
  sym = LLVMObjectFileCopySymbolIterator(O);
80
  while (sect && sym && !LLVMObjectFileIsSymbolIteratorAtEnd(O, sym)) {
81

82
    LLVMMoveToContainingSection(sect, sym);
83
    printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym),
84
           LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym),
85
           LLVMGetSectionName(sect));
86

87
    LLVMMoveToNextSymbol(sym);
88
  }
89

90
  LLVMDisposeSymbolIterator(sym);
91

92
  LLVMDisposeBinary(O);
93

94
  LLVMDisposeMemoryBuffer(MB);
95

96
  return 0;
97
}
98

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.