如何将libc中的函数内联到gcc中?

如何将libc中的函数内联到gcc中?,gcc,inline,mips,Gcc,Inline,Mips,我遇到了以下问题:我的软件导致了死锁,关于它的起源,我唯一的线索就是我的芯片组在这种情况下只提供了8个级别的原始堆栈跟踪 但是,我的堆栈跟踪类似于: memset memset memset memset memset memset memset memset 我想删除memset,看看是哪个函数造成了这种混乱。如果我要求gcc内联memset,它会抱怨说我没有它的函数体 那么,有没有办法内联memset呢?有人对调试这个问题有其他想法吗 编辑 我已经尝试过使用for用一个愚蠢的实现来替换me

我遇到了以下问题:我的软件导致了死锁,关于它的起源,我唯一的线索就是我的芯片组在这种情况下只提供了8个级别的原始堆栈跟踪

但是,我的堆栈跟踪类似于:

memset
memset
memset
memset
memset
memset
memset
memset
我想删除memset,看看是哪个函数造成了这种混乱。如果我要求gcc内联memset,它会抱怨说我没有它的函数体

那么,有没有办法内联memset呢?有人对调试这个问题有其他想法吗

编辑

我已经尝试过使用for用一个愚蠢的实现来替换memset,但是这使得我的软件行为异常,并且出现了其他问题,阻止我进入死锁

编辑

顺便说一下,我用的是MIPS拱门。我不是MIPS汇编专家,所以我做了一次愚蠢的尝试,试图获取memset的反汇编代码并插入到C函数体中。我从objdump-d和gdb反汇编中得到了不同的指令,所以我尝试了这两种方法。以下是我创建的函数:

void * memset(void * str_a, int ch, size_t count) {
    asm("mov    #12,r0");
    asm("cmp/gt r6,r0");
    asm("mov    r4,r0");
    asm("bt.s   30 <.L_dup_bytes+0x18>");
    asm("add    r4,r6");
    asm("tst    #3,r0");
    asm("bt.s   18 <.L_dup_bytes>");
    asm("extu.b r5,r5");
    asm("mov.b  r5,@r0");
    asm("add    #1,r0");
    asm("tst    #3,r0");
    asm("bf 10 <_memset+0x10>");
}

void * memset(void * str_a, int ch, size_t count) {
    asm("mov    #12,r0");
    asm("cmp/gt r6,r0");
    asm("mov    r4,r0");
    asm("bt.s   0x8163682c <memset+48>");
    asm("add    r4,r6");
    asm("tst    #3,r0");
    asm("bt.s   0x81636814 <memset+24>");
    asm("extu.b r5,r5");
    asm("mov.b  r5,@r0");
    asm("add    #1,r0");
    asm("tst    #3,r0");
    asm("bf 0x8163680c <memset+16>");
    asm("swap.b r5,r2");
    asm("or r2,r5");
    asm("swap.w r5,r2");
    asm("or r2,r5");
    asm("add    #-16,r6");
    asm("nop    ");
    asm("mov.l  r5,@r0");
    asm("cmp/hs r6,r0");
    asm("mov.l  r5,@(4,r0)");
    asm("bf.s   0x81636820 <memset+36>");
    asm("add    #8,r0");
    asm("add    #16,r6");
    asm("cmp/eq r6,r0");
    asm("bt 0x81636838 <memset+60>");
    asm("mov.b  r5,@r0");
    asm("add    #1,r0");
    asm("cmp/eq r6,r0");
    asm("bf 0x81636830 <memset+52>");
    asm("rts    ");
    asm("mov    r4,r0");
}
第二个成员集:

/tmp/cctCDgi5.s: Assembler messages:
/tmp/cctCDgi5.s:3457: Warning: missing operand; zero assumed
/tmp/cctCDgi5.s:3469: Warning: missing operand; zero assumed
/tmp/cctCDgi5.s:3489: Warning: missing operand; zero assumed
/tmp/cctCDgi5.s:3529: Warning: missing operand; zero assumed
/tmp/cctCDgi5.s:3545: Warning: missing operand; zero assumed
/tmp/cctCDgi5.s:3561: Warning: missing operand; zero assumed
/tmp/cctCDgi5.s:3457: Error: displacement to defined symbol .L0 overflows 8-bit field
/tmp/cctCDgi5.s:3469: Error: displacement to defined symbol .L0 overflows 8-bit field
/tmp/cctCDgi5.s:3489: Error: displacement to defined symbol .L0 overflows 8-bit field
/tmp/cctCDgi5.s:3529: Error: displacement to defined symbol .L0 overflows 8-bit field
/tmp/cctCDgi5.s:3545: Error: displacement to defined symbol .L0 overflows 8-bit field
/tmp/cctCDgi5.s:3561: Error: displacement to defined symbol .L0 overflows 8-bit field
有人能帮忙解决这些错误吗

编辑

尝试了另一个版本,源代码来自:

void * memset(void * str_a, int ch, size_t count) {    
    asm("slti    t1, a2, 8               ");
    asm("bne     t1, zero, L(last8)");
    asm("move    v0, a0                  ");
    asm("beq     a1, zero, L(ueven)      ");
    asm("andi    a1, 0xff                ");
    asm("sll     t0, a1, 8");
    asm("or      a1, t0");
    asm("sll     t0, a1, 16");
    asm("or      a1, t0                  ");
    asm("L(ueven):       ");
    asm("subu    t0, zero, a0            ");
    asm("andi    t0, 0x3");
    asm("beq     t0, zero, L(chkw)");
    asm("subu    a2, t0");
    asm("SWHI    a1, 0(a0)               ");
    asm("addu    a0, t0                  ");
    asm("L(chkw):        ");
    asm("andi    t0, a2, 0x7             ");
    asm("beq     t0, a2, L(chkl)");
    asm("subu    a3, a2, t0");
    asm("addu    a3, a0                  ");
    asm("move    a2, t0                  ");
    asm("L(loopw):       ");
    asm("addiu   a0, 8                   ");
    asm("sw      a1, -8(a0)");
    asm("bne     a0, a3, L(loopw)");
    asm("sw      a1, -4(a0)");
    asm("L(chkl):        ");
    asm("andi    t0, a2, 0x4             ");
    asm("beq     t0, zero, L(last8)      ");
    asm("subu    a2, t0");
    asm("sw      a1, 0(a0)               ");
    asm("addiu   a0, 4");
    asm("L(last8):       ");
    asm("blez    a2, L(exit)             ");
    asm("addu    a3, a2, a0              ");
    asm("L(lst8l):       ");
    asm("addiu   a0, 1");
    asm("bne     a0, a3, L(lst8l)");
    asm("sb      a1, -1(a0)");
    asm("L(exit):        ");
    asm("j       ra                      ");
    asm("nop");
}
以下是这次的错误:

/tmp/ccuyfGW5.s: Assembler messages:
/tmp/ccuyfGW5.s:5131: Error: unknown opcode
/tmp/ccuyfGW5.s:5135: Error: unknown opcode
/tmp/ccuyfGW5.s:5139: Error: unknown opcode
/tmp/ccuyfGW5.s:5143: Error: unknown opcode
/tmp/ccuyfGW5.s:5147: Error: unknown opcode
/tmp/ccuyfGW5.s:5151: Error: unknown opcode
/tmp/ccuyfGW5.s:5155: Error: invalid operands for opcode
/tmp/ccuyfGW5.s:5159: Error: unknown opcode
/tmp/ccuyfGW5.s:5163: Error: invalid operands for opcode
/tmp/ccuyfGW5.s:5167: Error: unknown opcode
/tmp/ccuyfGW5.s:5171: Error: unknown opcode
/tmp/ccuyfGW5.s:5175: Error: unknown opcode
/tmp/ccuyfGW5.s:5179: Error: unknown opcode
/tmp/ccuyfGW5.s:5183: Error: unknown opcode
/tmp/ccuyfGW5.s:5187: Error: unknown opcode
/tmp/ccuyfGW5.s:5191: Error: unknown opcode
/tmp/ccuyfGW5.s:5195: Error: unknown opcode
/tmp/ccuyfGW5.s:5199: Error: unknown opcode
/tmp/ccuyfGW5.s:5203: Error: unknown opcode
/tmp/ccuyfGW5.s:5207: Error: unknown opcode
/tmp/ccuyfGW5.s:5211: Error: unknown opcode
/tmp/ccuyfGW5.s:5215: Error: unknown opcode
/tmp/ccuyfGW5.s:5219: Error: unknown opcode
/tmp/ccuyfGW5.s:5223: Error: unknown opcode
/tmp/ccuyfGW5.s:5227: Error: unknown opcode
/tmp/ccuyfGW5.s:5231: Error: unknown opcode
/tmp/ccuyfGW5.s:5235: Error: unknown opcode
/tmp/ccuyfGW5.s:5239: Error: unknown opcode
/tmp/ccuyfGW5.s:5243: Error: unknown opcode
/tmp/ccuyfGW5.s:5247: Error: unknown opcode
/tmp/ccuyfGW5.s:5251: Error: unknown opcode
/tmp/ccuyfGW5.s:5255: Error: unknown opcode
/tmp/ccuyfGW5.s:5259: Error: unknown opcode
/tmp/ccuyfGW5.s:5263: Error: unknown opcode
/tmp/ccuyfGW5.s:5267: Error: unknown opcode
/tmp/ccuyfGW5.s:5271: Error: unknown opcode
/tmp/ccuyfGW5.s:5275: Error: unknown opcode
/tmp/ccuyfGW5.s:5279: Error: unknown opcode
/tmp/ccuyfGW5.s:5283: Error: unknown opcode
/tmp/ccuyfGW5.s:5287: Error: unknown opcode
/tmp/ccuyfGW5.s:5291: Error: unknown opcode
/tmp/ccuyfGW5.s:5295: Error: unknown opcode
编辑


问题确实与堆栈腐败有关,但是我将在这里提出这个问题,看看是否有人知道如何从子例程获取反汇编代码并将其放回C函数体进行内联的答案。

无论是
gdb
还是
objdump
都不会生成
gcc
内联MIPS汇编程序将接受的代码。我不知道有任何工具可以自动修复语法,因此需要手动更正汇编程序语法。您还需要告诉
gcc
哪些寄存器和/或内存将被内联asm代码更改。所有这些都不是一项微不足道的任务


如果您有
C
源代码,那么
gcc
-S
选项将生成几乎语法正确的MIPS汇编程序,但即使这样,也需要一些手动编辑。

可能实现您自己的memset,以便编译器可以内联?如果源代码不可用,您还可以反汇编memset调用并复制该实现,并将其提供给编译器。你能发布一个反汇编的例子并让它对编译器可用吗?我假设你正在使用某种调试器,比如
gdb
来获取堆栈跟踪。只需在任何
memset
调用上放置一个断点,并跟踪它。这个想法是为了得到伪装的指令。之后,您可以使用
\u asm
将其内联到您的C源代码中,或者手动将其反向工程回某个版本的C代码。您不必检查二进制文件,您可以参考原始源代码。上面有8级
memset()
的堆栈跟踪没有意义。您需要
memset()。因此,您的问题很可能是您对堆栈的其他暴力滥用,并且有东西在堆栈上复制数据,因此看起来有点像对
memset()
的多次调用。如果重复出现
memset()
,则可能会错误初始化堆栈分配的数组,可能会使用
sizeof(array)
而不是
sizeof(array)/sizeof(array[0])
来初始化元素并超出范围。可能会有帮助。好的!我现在不会在这个问题上投入更多的精力,这个答案似乎让任何寻找这个问题的人走上了正确的道路。谢谢
/tmp/ccuyfGW5.s: Assembler messages:
/tmp/ccuyfGW5.s:5131: Error: unknown opcode
/tmp/ccuyfGW5.s:5135: Error: unknown opcode
/tmp/ccuyfGW5.s:5139: Error: unknown opcode
/tmp/ccuyfGW5.s:5143: Error: unknown opcode
/tmp/ccuyfGW5.s:5147: Error: unknown opcode
/tmp/ccuyfGW5.s:5151: Error: unknown opcode
/tmp/ccuyfGW5.s:5155: Error: invalid operands for opcode
/tmp/ccuyfGW5.s:5159: Error: unknown opcode
/tmp/ccuyfGW5.s:5163: Error: invalid operands for opcode
/tmp/ccuyfGW5.s:5167: Error: unknown opcode
/tmp/ccuyfGW5.s:5171: Error: unknown opcode
/tmp/ccuyfGW5.s:5175: Error: unknown opcode
/tmp/ccuyfGW5.s:5179: Error: unknown opcode
/tmp/ccuyfGW5.s:5183: Error: unknown opcode
/tmp/ccuyfGW5.s:5187: Error: unknown opcode
/tmp/ccuyfGW5.s:5191: Error: unknown opcode
/tmp/ccuyfGW5.s:5195: Error: unknown opcode
/tmp/ccuyfGW5.s:5199: Error: unknown opcode
/tmp/ccuyfGW5.s:5203: Error: unknown opcode
/tmp/ccuyfGW5.s:5207: Error: unknown opcode
/tmp/ccuyfGW5.s:5211: Error: unknown opcode
/tmp/ccuyfGW5.s:5215: Error: unknown opcode
/tmp/ccuyfGW5.s:5219: Error: unknown opcode
/tmp/ccuyfGW5.s:5223: Error: unknown opcode
/tmp/ccuyfGW5.s:5227: Error: unknown opcode
/tmp/ccuyfGW5.s:5231: Error: unknown opcode
/tmp/ccuyfGW5.s:5235: Error: unknown opcode
/tmp/ccuyfGW5.s:5239: Error: unknown opcode
/tmp/ccuyfGW5.s:5243: Error: unknown opcode
/tmp/ccuyfGW5.s:5247: Error: unknown opcode
/tmp/ccuyfGW5.s:5251: Error: unknown opcode
/tmp/ccuyfGW5.s:5255: Error: unknown opcode
/tmp/ccuyfGW5.s:5259: Error: unknown opcode
/tmp/ccuyfGW5.s:5263: Error: unknown opcode
/tmp/ccuyfGW5.s:5267: Error: unknown opcode
/tmp/ccuyfGW5.s:5271: Error: unknown opcode
/tmp/ccuyfGW5.s:5275: Error: unknown opcode
/tmp/ccuyfGW5.s:5279: Error: unknown opcode
/tmp/ccuyfGW5.s:5283: Error: unknown opcode
/tmp/ccuyfGW5.s:5287: Error: unknown opcode
/tmp/ccuyfGW5.s:5291: Error: unknown opcode
/tmp/ccuyfGW5.s:5295: Error: unknown opcode