Chuyu-Team / VC-LTL

Shared to msvcrt.dll and optimize the C/C++ application file size.
Eclipse Public License 2.0
1.05k stars 204 forks source link

__acrt_heap 获取 nullptr #55

Closed catsxp closed 5 years ago

catsxp commented 5 years ago

如题 LLVM 下对于函数 _get_heap_handle __acrt_heap 获取总为 nullptr 源码跟进,断点 acrt_initialize_heap ,貌似并没有去 acrt_initialize_heap 创建 而直接 _get_heap_handle。 改了 _get_heap_handle,让它 先去 __acrt_initialize_heap ,治标不治本其它地方还是暴0xc00005 在不使用 LTL 编译正常 起初以为是mode的原因,但改成 new_mode 问题似旧!

mingkuang-Chuyu commented 5 years ago

VC-LTL根本就没有__acrt_initialize_heap,而是直接使用直接使用msvcrt的heap....加群具体说下吧,可能链接有些问题。

catsxp commented 5 years ago

并不是断在 LTL里的,这问题一个月以前就发现了 只是一直拖着自己在尝试源码修正,但效果极差!放弃了!

xspeed1989 commented 5 years ago

HANDLE __acrt_heap = nullptr;

bool __acrt_initialize_heap() {

__acrt_heap = ::HeapCreate(0, 0, 0);

return true;

}

bool __acrt_uninitialize_heap() {

::HeapDestroy(__acrt_heap);

__acrt_heap = nullptr;

return true;

}

intptr_t _get_heap_handle(void) {

return reinterpret_cast<intptr_t>(__acrt_heap);

}

试试找到相关代码注释掉,不好用不要钱

xspeed1989 commented 5 years ago
int main()
{
    CPINFOEXA ci;
    printf("%08X", _get_heap_handle());
    system("pause");
}

clang-cl+ltl编译运行结果 C:\Users\xspee\source\repos\ConsoleApplication1\ConsoleApplication1>clang-cl ConsoleApplication1.cpp ConsoleApplication1.cpp(12,17): warning: format specifies type 'unsigned int' but the argument has type 'intptr_t' (aka 'long long') [-Wformat] printf("%08X", _get_heap_handle());


                %08llX
1 warning generated.

C:\Users\xspee\source\repos\ConsoleApplication1\ConsoleApplication1>ConsoleApplication1.exe
0C2D0000请按任意键继续. . .
catsxp commented 5 years ago
HANDLE __acrt_heap = nullptr;

bool __acrt_initialize_heap() {

__acrt_heap = ::HeapCreate(0, 0, 0);

return true;

}

bool __acrt_uninitialize_heap() {

::HeapDestroy(__acrt_heap);

__acrt_heap = nullptr;

return true;

}

intptr_t _get_heap_handle(void) {

return reinterpret_cast<intptr_t>(__acrt_heap);

}

试试找到相关代码注释掉,不好用不要钱

感谢!思维受限制了,一直在尝试修正,猜测是引用不明引起的。 试一试!先谢过了!

xspeed1989 commented 5 years ago
HANDLE __acrt_heap = nullptr;

bool __acrt_initialize_heap() {

__acrt_heap = ::HeapCreate(0, 0, 0);

return true;

}

bool __acrt_uninitialize_heap() {

::HeapDestroy(__acrt_heap);

__acrt_heap = nullptr;

return true;

}

intptr_t _get_heap_handle(void) {

return reinterpret_cast<intptr_t>(__acrt_heap);

}

试试找到相关代码注释掉,不好用不要钱

感谢!思维受限制了,一直在尝试修正,猜测是引用不明引起的。 试一试!先谢过了!

测试过了,前来报到 我这边的文件是allocator_shim_override_ucrt_symbols_win.h 不知道你是什么项目

mingkuang-Chuyu commented 5 years ago

哦,你说的是这个问题啊,,,,很久以前我们发现并且找到了解决方案,在QT里。 VC-LTL已经直接导出了,_get_heap_handle,外部无需在实现一份。这个源代码我也感到很奇怪,微软不是提供了crt api获取,为什么他还要自己创建一个堆。问题引发根源是VC-LTL直接使用的是msvcrt.dll的堆,所以__acrt_initialize_heap根本就不会去调用。所以把这边实现的_get_heap_handle注释掉,直接调用msvcrt导出的就可以啦。