cuốn sách gpt4 ai đã làm

c - Hợp nhất phần ELF riêng của thư viện vào phần ELF dành riêng cho ứng dụng

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 07:53:48 26 4
mua khóa gpt4 Nike

Đây là bài kiểm tra của tôi. Tôi có một nguồn chính.clinh tinh.c bao gồm chủ yếu ứng dụng và một được thực hiện bởi Thư viện tĩnh bao gồm lib.c<.

Mục tiêu:Tôi muốn có phần ELF .mô-đun tuyên bố tất cả của tôi mô-đun cấu trúc tuyên bố.

câu hỏiTôi chỉ có thể nhìn thấy những cái từ ứng dụng chínhmô-đun cấu trúc tuyên bố. Đây là đầu ra tôi có thể thấy bằng cách sử dụng đoạn mã sau:

Xin chào thế giới
- mô-đun: mô-đun_a
- mô-đun: mô-đun_b

nếu tôi muốn my_lib() 调用到 chủ yếu() , lúc đó tôi sẽ thấy:

Xin chào thế giới
MyLib
- mô-đun: mô-đun_a
- mô-đun: mô-đun_b
- mô-đun: mô-đun_lib

Nhưng tôi không quan tâm đến việc gọi trực tiếp chức năng của mô-đun trong ứng dụng chính của mình.

  • CMakeLists.txt

    add_executable(main main.c misc.c)

    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")

    set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/linker.ld")
    đặt(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${LINKER_SCRIPT}")

    add_library(static_lib STATIC lib.c)

    target_link_libraries(static_lib chính)
  • chính.c

    #include "mô-đun.h"

    mô-đun cấu trúc bên ngoài const module_start[];
    mô-đun cấu trúc bên ngoài const module_end[];

    mô-đun cấu trúc __attribute__ ((section ("".modules"))) module_a = {
    .name = "mô-đun_a",
    };

    int chính(void) {
    đặt ("Xin chào thế giới");

    const struct module *m = module_start;
    trong khi (m < module_end) {
    printf("- module:%s\n", m->name);
    m++;
    }

    return 0;
    }
  • linh tinh.c

    #include "mô-đun.h"

    struct module __attribute__ ((section ("".modules"))) module_b = {
    .name = "mô-đun_b",
    };
  • mô-đun.h

    #include 

    mô-đun cấu trúc {
    tên const char*;
    };
  • lib.c

    #include "mô-đun.h"

    mô-đun cấu trúc __attribute__ ((section ("".modules"))) __attribute__ ((đã sử dụng)) module_lib = {
    .name = "mô-đun_lib",
    };

    int my_lib(void) {
    đặt("MyLib");
    return 0;
    }
  • linker.ld

    PHẦN
    {
    .mô-đun : {
    module_start = .;
    GIỮ(*(.modules))
    module_end = .;
    }
    }
    XÁC NHẬN SAU .rodata;

Dưới đây là một số thông tin về ELF:

$ readelf --sections libstatic_lib.a | grep -A 1 mô-đun
[5] .modules PROGBITS 0000000000000000 00000058
0000000000000008 00000000000000000 WA 0 0 8
[6] .rela.modules RELA 0000000000000000 00000278
0000000000000018 00000000000000018 Tôi 13 5 8

$ readelf --sections main | grep -A 1 mô-đun
[17] .modules PROGBITS 00000000000009c0 000009c0
0000000000000010 00000000000000000 WA 0 0 8

mô-đun grep $ nm libstatic_lib.a |
0000000000000000 D mô-đun_lib

mô-đun grep $ nm chính |
00000000000009c0 D mô-đun_a
00000000000009c8 Mô-đun D_b
00000000000009d0 D mô-đun_end
00000000000009c0 D module_start

câu trả lời hay nhất

Nếu không có tham chiếu đến tệp đối tượng trong thư viện tĩnh thì tệp đối tượng đó không được đưa vào liên kết theo mặc định. Sử dụng trình liên kết binutils bạn có thể sử dụng --toàn bộ kho lưu trữ option Vô hiệu hóa tối ưu hóa này. .

Về c - hợp nhất phần ELF riêng của thư viện vào phần ELF dành riêng cho ứng dụng, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/51917879/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress