国家的人gold:
-L DIR, --library-path DIR
Add directory to search path
--rpath-link DIR
Add DIR to link time shared library search path
Run Code Online (Sandbox Code Playgroud)
bfd的男人ld让它有点像-rpath-link用于递归包含sos 的声音.
ld.lld 甚至没有将其列为参数.
有人可以为我澄清这种情况吗?
这个问题是我之前提出的另一个问题.简而言之,这是我尝试将两个完全链接的可执行文件合并为一个完全链接的可执行文件的尝试之一.区别在于前一个问题涉及将目标文件合并到一个完整的链接可执行文件,这更难,因为这意味着我需要手动处理重定位.
我所拥有的是以下文件:
example-target.c:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
puts("1234");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
example-embed.c:
#include <stdlib.h>
#include <stdio.h>
/*
* Fake main. Never used, just there so we can perform a full link.
*/
int main(void)
{
return EXIT_SUCCESS;
}
void func1(void)
{
puts("asdf");
}
Run Code Online (Sandbox Code Playgroud)
我的目标是合并这两个可执行文件以生成一个最终的可执行文件,它与之相同example-target,但另外还有另一个main和func1.
从BFD库的角度来看,每个二进制文件由一组部分组成(以及其他内容).我遇到的第一个问题之一是这些部分具有冲突的加载地址(这样,如果我要合并它们,这些部分将重叠).
我解决这个问题的方法是以example-target编程方式分析,以获取每个部分的加载地址和大小的列表.然后,我做了同样的事情,example-embed并使用此信息动态生成链接器命令,example-embed.c以确保其所有部分链接在不与任何部分重叠的地址example-target.因此example-embed,在这个过程中实际上完全链接了两次:一次确定它们有多少部分和大小,并再次与保证没有部分冲突相关联example-target.
在我的系统上,生成的链接器命令是:
-Wl,--section-start=.new.interp=0x1004238,--section-start=.new.note.ABI-tag=0x1004254,
--section-start=.new.note.gnu.build-id=0x1004274,--section-start=.new.gnu.hash=0x1004298,
--section-start=.new.dynsym=0x10042B8,--section-start=.new.dynstr=0x1004318,
--section-start=.new.gnu.version=0x1004356,--section-start=.new.gnu.version_r=0x1004360,
--section-start=.new.rela.dyn=0x1004380,--section-start=.new.rela.plt=0x1004398,
--section-start=.new.init=0x10043C8,--section-start=.new.plt=0x10043E0, …Run Code Online (Sandbox Code Playgroud) 是否可以在 C 程序中在运行时知道函数参数和变量的名称类型?例如,如果我有一个函数:
int abc(int x, float y , somestruct z ){
char a;
int b ;
}
Run Code Online (Sandbox Code Playgroud)
我可以知道在这个函数内部abc(),参数和变量的名称是什么,即在这种情况下它的x, y, z, a,b它们的类型是int, float, somestruct, char, int。
说是否还有另一个功能:
float some_func(specialstruct my_struct, int index){
}
Run Code Online (Sandbox Code Playgroud)
我应该知道参数 name 是my_struct,index类型是specialstruct, int。
我在运行时需要这些信息?
我可以访问基指针和返回地址,是否可以使用上述指针获取所需信息。
我能够使用返回地址和dladdr()函数提取函数名称。
我明白了GDB,所以应该可以提取这些信息?
[编辑]
这只是我进行的一个实验,我想看看是否可以欺骗内核从无名管道执行精灵,并使用 /lib64/ld-linux-x86-64.so 进行进程替换。 2,我知道这是在黑暗中进行的尝试,但我只是希望看看是否有人能给我一个答案,为什么它不起作用
$ /lib64/ld-linux-x86-64.so.2 <(gcc -c -xc <(echo $'#include <stdio.h>\n\nint main(){\nprintf("I work\\n");\nreturn 0;\n}') -o /dev/stdout)
/tmp/ccf5sMql.s: Assembler messages:
/tmp/ccf5sMql.s: Fatal error: can't write /dev/stdout: Illegal seek
as: BFD version 2.25.1-22.base.el7 assertion fail elf.c:2660
as: BFD version 2.25.1-22.base.el7 assertion fail elf.c:2660
/tmp/ccf5sMql.s: Fatal error: can't close /dev/stdout: Illegal seek
/dev/fd/63: error while loading shared libraries: /dev/fd/63: file too short
Run Code Online (Sandbox Code Playgroud)
我认为由于我得到的结果不同,这可能是可能的。
$ /lib64/ld-linux-x86-64.so.2 <(gcc -fPIC -pie -xc <(echo $'#include
<stdio.h>\n\nint main(){\nprintf("I work\\n");\nreturn 0;\n}') -o
/dev/stdout|cat|perl -ne 'chomp;printf')
/dev/fd/63: error …Run Code Online (Sandbox Code Playgroud) 我试图编译一个7.x版本的gdb而没有任何运气.我对可执行文件进行了编码(http://sourceware.org/gdb/wiki/BuildingOnDarwin).
以下版本存在这些问题.
7.5,7.4,git clone:我的应用程序的未知加载命令0x2a(和其他)以及启动gbd时的不同系统库.当试图打印矢量时,我总是得到:找不到"main(int,char**)"的框架基数
7.3(macports和gdb-website):在启动应用程序时,它无法设置断点并继续运行.
(gdb) start
Temporary breakpoint 1 at 0x100000950: file ../src/main.cpp, line 15.
Starting program: [...]
BFD: unable to read unknown load command 0x24
BFD: unable to read unknown load command 0x2a
BFD: unable to read unknown load command 0x26
Error in re-setting breakpoint 1: Cannot access memory at address 0x100000950
[application continues]
Run Code Online (Sandbox Code Playgroud)
我使用系统llvm-gcc,gcc4.7和svn-gcc4.8进行编译.有没有人成功在Mountain Lion上安装gdb?