如何解决link.exe中的LNK4254警告? [英] How can I resolve LNK4254 warnings in link.exe?

查看:383
本文介绍了如何解决link.exe中的LNK4254警告?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在试图编译一个开源项目. /p>

其中一个步骤涉及运行具有以下行的.mak文件:

kbddvp32.dll: kbddvp32.obj kbddvp.res
        $(LINK32) -nologo -dll -base:0x5FFF0000 -subsystem:native -def:kbddvp.def -noentry \
             -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data \
         -ignore:4078,4070 -section:.data,re -opt:nowin98 -stack:0x40000,0x1000 -opt:ref,icf \
         -release -out:$@ $**

...变成:

link -machine:ix86 -nologo -dll -base:0x5FFF0000 -subsystem:native -def:
kbddvp.def -noentry  -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data
-merge:.bss=.data  -ignore:4078,4070 -section:.data,re -opt:nowin98 -stack:0x400
00,0x1000 -opt:ref,icf  -release -out:kbddvp32.dll kbddvp32.obj kbddvp.res

...,并且在执行时会产生以下警告:

LINK : warning LNK4224: /OPT:NOWIN98 is no longer supported;  ignored
   Creating library kbddvp32.lib and object kbddvp32.exp
LINK : warning LNK4254: section '.edata' (40000040) merged into '.data' (C000004
0) with different attributes
LINK : warning LNK4254: section '.rdata' (40000040) merged into '.data' (C000004
0) with different attributes
LINK : warning LNK4254: section '.text' (60000020) merged into '.data' (C0000040
) with different attributes
LINK : warning LNK4254: section '.bss' (C0000080) merged into '.data' (C0000040)
 with different attributes

我尝试阅读有关警告LNK4254的文档,但是我对link.exe的了解不足以了解如何解决它.

文件kbddvp.def包含:

LIBRARY KBDDVP

EXPORTS
    KbdLayerDescriptor  @1

.mak文件链接到此页面这似乎是根据的,并且是首先使用-merge:部件的原因.我意识到此页面表明您可以改用 MSKLC 1.4 ,但是它不支持我要实现的所有功能.

如何解决这些LNK4254警告,或者我可以安全地忽略它们?

解决方案

此处最初发生的是所有部分都合并到.data中, 然后将其属性设置为读取,执行.

警告是因为其他部分的属性之前没有相同 他们被合并了.但是,由于新合并的部分.data具有其属性, 显式设置,则可以忽略它.

您可以通过比较以下两个命令的输出来验证这一点:

link /dump /section:.data kbddvp32.dll
link /dump /section:.data kbdus.dll

I'm trying to compile an open-source project.

One of the steps involves running a .mak file which has the following line:

kbddvp32.dll: kbddvp32.obj kbddvp.res
        $(LINK32) -nologo -dll -base:0x5FFF0000 -subsystem:native -def:kbddvp.def -noentry \
             -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data \
         -ignore:4078,4070 -section:.data,re -opt:nowin98 -stack:0x40000,0x1000 -opt:ref,icf \
         -release -out:$@ $**

... that becomes:

link -machine:ix86 -nologo -dll -base:0x5FFF0000 -subsystem:native -def:
kbddvp.def -noentry  -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data
-merge:.bss=.data  -ignore:4078,4070 -section:.data,re -opt:nowin98 -stack:0x400
00,0x1000 -opt:ref,icf  -release -out:kbddvp32.dll kbddvp32.obj kbddvp.res

... and when executes, produces the following warnings:

LINK : warning LNK4224: /OPT:NOWIN98 is no longer supported;  ignored
   Creating library kbddvp32.lib and object kbddvp32.exp
LINK : warning LNK4254: section '.edata' (40000040) merged into '.data' (C000004
0) with different attributes
LINK : warning LNK4254: section '.rdata' (40000040) merged into '.data' (C000004
0) with different attributes
LINK : warning LNK4254: section '.text' (60000020) merged into '.data' (C0000040
) with different attributes
LINK : warning LNK4254: section '.bss' (C0000080) merged into '.data' (C0000040)
 with different attributes

I tried reading the documentation for warning LNK4254, but I don't know enough about link.exe to understand how to fix it.

The file kbddvp.def contains:

LIBRARY KBDDVP

EXPORTS
    KbdLayerDescriptor  @1

The .mak file links to this page which it seems to be based off of, and is the reason the -merge: parts are used in the first place. I realize that this page says that you can use MSKLC 1.4 instead, however it doesn't support all the features I want to implement.

How can I solve these LNK4254 warnings, or can I safely ignore them?

解决方案

What happens here originally is that all sections are merged into .data, and then its attributes are set to Read, Execute.

The warnings are because the other sections' attributes are different before they are merged. However, since the new merged section .data have its attributes explicitly set, you can ignore it.

You can verify this by comparing the output of these two commands:

link /dump /section:.data kbddvp32.dll
link /dump /section:.data kbdus.dll

这篇关于如何解决link.exe中的LNK4254警告?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆