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