草庐IT

c - GNU libc.so 如何既是共享对象又是独立可执行文件?

在Linux中,GNU标准C库的共享库(libc.so)不仅是一个共享库,还可以作为独立的可执行文件运行,打印出版本信息:[me@computer~]$/lib/libc.so.6GNUCLibrarystablereleaseversion2.12,byRolandMcGrathetal.Copyright(C)2010FreeSoftwareFoundation,Inc.Thisisfreesoftware;seethesourceforcopyingconditions.ThereisNOwarranty;notevenforMERCHANTABILITYorFITNESSFOR

c - GNU libc.so 如何既是共享对象又是独立可执行文件?

在Linux中,GNU标准C库的共享库(libc.so)不仅是一个共享库,还可以作为独立的可执行文件运行,打印出版本信息:[me@computer~]$/lib/libc.so.6GNUCLibrarystablereleaseversion2.12,byRolandMcGrathetal.Copyright(C)2010FreeSoftwareFoundation,Inc.Thisisfreesoftware;seethesourceforcopyingconditions.ThereisNOwarranty;notevenforMERCHANTABILITYorFITNESSFOR

c - 是否有用于从文件中读取名称/值对的广泛使用的 C 库?

我的程序正在读取一个文本文件,其中包含设置文件的多行文本。有些线可能会变得非常大。当前缓冲区大小为4096个字符。某些行可能会超出此范围,无论是出于恶意还是由于程序中运行的各种因素。当前的例程编写起来相当乏味,现在我想扩展文件的可能内容,这将需要更多这种乏味的重复代码。(这是一个设置类型文件,由namevalue对和偶尔的部分标题组成。由于多重精度,一些数值需要作为字符串读取)。我想要的主要是读取任意长度的行而不会出现缓冲区溢出。我刚刚发现getline可以为我做这件事,但是,看在上帝的份上,是否有一个图书馆可以为我完成所有这些乏味的工作?编辑:我不想被迫在名称和值之间放置一个=符号,

c - 是否有用于从文件中读取名称/值对的广泛使用的 C 库?

我的程序正在读取一个文本文件,其中包含设置文件的多行文本。有些线可能会变得非常大。当前缓冲区大小为4096个字符。某些行可能会超出此范围,无论是出于恶意还是由于程序中运行的各种因素。当前的例程编写起来相当乏味,现在我想扩展文件的可能内容,这将需要更多这种乏味的重复代码。(这是一个设置类型文件,由namevalue对和偶尔的部分标题组成。由于多重精度,一些数值需要作为字符串读取)。我想要的主要是读取任意长度的行而不会出现缓冲区溢出。我刚刚发现getline可以为我做这件事,但是,看在上帝的份上,是否有一个图书馆可以为我完成所有这些乏味的工作?编辑:我不想被迫在名称和值之间放置一个=符号,

c - 链接到多个共享库,这些共享库都链接到一个公共(public)静态库

假设您有2个共享库,lib1.so和lib2.so,它们都静态链接了libcommon.a。如果您要动态链接lib1.so和lib2.so,编译器会提示符号引用不明确吗?或者编译器是否足够聪明,知道libcommon符号在lib1和lib2之间共享,并允许您针对两者动态链接? 最佳答案 不会有冲突,因为当您链接到共享库时,链接器将使用第一个提供符号的共享库的定义,而不会进一步查看其他共享库。.a中包含的符号将导出到两个共享库中,但不会发生冲突。 关于c-链接到多个共享库,这些共享库都链接

c - 链接到多个共享库,这些共享库都链接到一个公共(public)静态库

假设您有2个共享库,lib1.so和lib2.so,它们都静态链接了libcommon.a。如果您要动态链接lib1.so和lib2.so,编译器会提示符号引用不明确吗?或者编译器是否足够聪明,知道libcommon符号在lib1和lib2之间共享,并允许您针对两者动态链接? 最佳答案 不会有冲突,因为当您链接到共享库时,链接器将使用第一个提供符号的共享库的定义,而不会进一步查看其他共享库。.a中包含的符号将导出到两个共享库中,但不会发生冲突。 关于c-链接到多个共享库,这些共享库都链接

在运行时更改库加载顺序(如 LD_PRELOAD 但在执行期间)

如何更改函数在运行时加载的库?例如,假设我想用新的东西替换标准的printf函数,我可以编写自己的版本并将其编译到共享库中,然后将“LD_PRELOAD=/my/library.so"在运行我的可执行文件之前在环境中。但是,我想从程序本身内部更改该链接。这肯定是可能的……对吧?编辑不,以下内容不起作用(但如果你能告诉我如何让它起作用,那就足够了)。void*mylib=dlopen("/path/to/library.so",RTLD_NOW);printf=dlsym(mylib,"printf"); 最佳答案 据我所知,这是不可

在运行时更改库加载顺序(如 LD_PRELOAD 但在执行期间)

如何更改函数在运行时加载的库?例如,假设我想用新的东西替换标准的printf函数,我可以编写自己的版本并将其编译到共享库中,然后将“LD_PRELOAD=/my/library.so"在运行我的可执行文件之前在环境中。但是,我想从程序本身内部更改该链接。这肯定是可能的……对吧?编辑不,以下内容不起作用(但如果你能告诉我如何让它起作用,那就足够了)。void*mylib=dlopen("/path/to/library.so",RTLD_NOW);printf=dlsym(mylib,"printf"); 最佳答案 据我所知,这是不可

c - 如何编译ELF二进制文件,使其可以作为动态库加载?

这个问题在这里已经有了答案:buildinga.sothatisalsoanexecutable(3个答案)关闭7年前。这是理论问题。我知道也许最佳实践是使用共享库。但我遇到了这个问题,似乎无法在任何地方找到答案。如何构造代码并编译成ELF格式的C/C++程序,以便用dlopen()加载?例如,如果一个可执行文件包含某个函数inttest()的实现,我想从我的程序中调用这个函数(最好是获取函数的结果),如果可能的话,我该怎么做呢?在伪代码中我可以这样描述它:ELF可执行源:voidmain(){inti=test();printf("Returned:%d",i);//Prints"R

c - 如何编译ELF二进制文件,使其可以作为动态库加载?

这个问题在这里已经有了答案:buildinga.sothatisalsoanexecutable(3个答案)关闭7年前。这是理论问题。我知道也许最佳实践是使用共享库。但我遇到了这个问题,似乎无法在任何地方找到答案。如何构造代码并编译成ELF格式的C/C++程序,以便用dlopen()加载?例如,如果一个可执行文件包含某个函数inttest()的实现,我想从我的程序中调用这个函数(最好是获取函数的结果),如果可能的话,我该怎么做呢?在伪代码中我可以这样描述它:ELF可执行源:voidmain(){inti=test();printf("Returned:%d",i);//Prints"R