如何从一个目标文件中读取而不链接另一个目标文件?

时间:2019-01-22 08:04:39

标签: c

我在文本文件中有一些二进制数据: 文件名: bin_data: 0x04 0x82 0x48 0x69

我已经使用 ld -r -b二进制-o bin_data.o bin_data

我写了一个CPP程序

文件名: check.cpp

#include<stdio.h>
#include<stdint.h>


extern char _binary_bin_data_start[];
extern char _binary_bin_data_end[];
int main() 
{
    printf(" start \n");    
    printf( "address of start: %p\n", &_binary_bin_data_start);
    printf( "address of end: %p\n", &_binary_bin_data_end);
    for (char* p = _binary_bin_data_start; p != _binary_bin_data_end; ++p)
    {
     putchar( *p);
    }
    return 0;
}

我已经编译了check.cpp和genratedcheck.o

为了从bin_data.o中读取数据,我需要同时链接文件和生成的 a.o 并运行。 在我的应用程序中,每次模拟都会更改 bin_data ,并且我不想每次bin_data发生更改时都链接check.o和bin_data.o。 这附近有工作吗?这样我就不必链接check.o和bin_data.o

示例:

模拟1

bin_data 文件:0x04,0x82,0x48,0x69

ld -r -b binary -o bin_data.o bin_data   -> generates bin_data.o
gcc -c check.cpp                             -> generates check.o
gcc check.o bin_data.o
./a.out

输出:

0x04
0x82
0x48
0x69

模拟2

更改 bin_data 文件中的数据:0x55,0x66,0x77,0x88,0x99

ld -r -b binary -o bin_data.o bin_data   -> generates bin_data.o
//gcc -c check.cpp          //want to avoid this step
//gcc check.o bin_data.o    //want to avoid this step
./a.out

输出:

0x55
0x66
0x77
0x88
0x99

1 个答案:

答案 0 :(得分:0)

如果您确实希望在执行过程中将数据读取为文件,并且不想在每次修改数据时都再次使可执行文件成为可能,则唯一的可能性似乎是将数据放入动态库中。这样,您每次修改数据时都必须重做动态库,然后无需构建即可重新启动可执行文件。当然,_binary_bin_data_start_binary_bin_data_end的签名不得更改并保持char[]